我有一个django项目,并希望硬编码链接到CSS(我不希望使用STATIC_FILES ......等)。原因是因为我希望能够单击index.html并且它将在浏览器上工作(包括获取css文件)。
我将 index.html 和 index.css 放在同一目录中,并在index.html中添加了这一行:
<link rel="stylesheet" type="text/css" href="./index.css"/>
当我双击 index.html 时,它会完美地导入 index.css 。
但是,当我使用django开发服务器加载它并通过浏览器打开时,它不会导入 index.css 。
应该做什么才能让 index.html 获取 index.css ?
答案 0 :(得分:1)
那是因为浏览器使用基于目录的方法。
假设您的模板目录如下所示:
/home/yura/project/templates/
→ index.html
→ index.css
使用浏览器打开index.html时,它明显地在同一目录中查找index.css,因此/home/yura/project/templates/index.css
。
现在,当您运行开发服务器时,它不再是基于目录的。 urls.py
文件指定了每条路径的位置。
即使/
没有被称为“{1}”,您的路线index.html
也可能导致index.html
。即使文件名为/blog/
,您也可以添加可能导致blog_home.html
的路线blog_home.html
。
进入django的每个url都会通过urls.py
文件进行路由。
这是django的核心概念之一。 URL应该是用户可用的,并且可读,而不是像.php
,.html
那样来自基于目录的方法(如PHP或CGI)。
由于您尚未定义名为/index.css
的路线,因此找不到index.css
。
如果您正在做的事情是一次性的,那么您最好的选择就是添加一条提供/index.css
index.css
的路线。
否则无法做到这一点,因为django不是基于目录的,如上所述。
您可能想要考虑为什么您希望能够直接在浏览器中打开原始html文件,因为它会使django模板语言对您完全无用,因此您无法做任何事情变量,循环和逻辑相关,并坚持使用基本的html,而不是django-dev服务器也可以使用简单的http服务器。
答案 1 :(得分:1)
克里斯托弗·谢珀斯(ChristopherSchäpers)的回答很好用,我想通过展示您实际上如何做她的建议来扩展她的回答。
假设您有
<link rel="stylesheet" type="text/css" href="/index.css"/>
这意味着浏览器正在请求localhost:8000/index.css
,因此,在根urls.py
文件中,您需要添加以下内容
from django.urls import path
from django.conf import settings
from django.http import HttpResponse
def css_path(request): # This is basically a "view"
path = settings.BASE_DIR / 'index.css' # For earlier Django version: os.path.join(settings.BASE_DIR, 'index.css')
with open(path, 'rb') as f:
content = f.read()
return HttpResponse(content, content_type='text/css')
urlpatterns = [
# ... (your other url patterns)
path('index.css', css_path)
]
注意:请记住,根据您所服务的内容正确设置content_type
关键字参数(例如:application/javascript
的{{1}},.js
的{{1}}, .etc)。