我有一个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?Christopher Schä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
用于.js
, image/png
用于.png
, .等)。
这是因为浏览器使用了基于目录的方法。
假设你的模板目录是这样的:/home/yura/project/templates/
→ index.html
→ index.css
当用浏览器打开index.html时,它会在同一目录中查找index.css,因此对于/home/yura/project/templates/index.css
。
现在当你运行开发服务器时,它不再是基于目录的。urls.py
文件指定了每个路径的指向。
您可能有一条通往index.html
的路由/
,即使index.html
没有被称为空。您还可以添加路由/blog/
,它可能会导致blog_home.html
,即使文件名为blog_home.html
。
每个进入django的url都是通过urls.py
文件路由的。这是django的核心概念之一。url应该是用户可输入和可读的,不需要像.php
, .html
这样的cruft,这些来自于基于目录的方法,如PHP或CGI。
由于您没有定义名为/index.css
的路由,因此无法找到index.css
。
如果您正在做的事情是一次性的,您最好的选择是添加一条到/index.css
的路由来传递index.css
。
否则没有办法这样做,因为django不是基于目录的,正如上面指出的。
你可能会想为什么你想直接在浏览器中打开原始的html文件,因为它使django模板语言对你来说完全没用,因此你不能做任何变量,循环和逻辑相关的事情,并且被基本的html所困扰,而不是django-dev服务器可以使用简单的http-server来代替。