Django静态文件应用帮助
我在使用Django的静态文件应用时遇到了一点问题。
我已经把
'django.contrib.staticfiles',
添加到了我的INSTALLED_APPS里,并且在我的
STATIC_URL = '/static/'
STATIC_ROOT = '/Users/kevdotbadger/django/mylook/static/'
文件中也做了相应的设置。
我所有的静态文件都放在我Mac上的STATIC_ROOT
文件夹里。
现在,在我的模板中我使用了
{{ STATIC_URL }}
这段代码,它正确地显示为/static/
。
但是
{{ STATIC_URL }}css/style.css
却出现了404错误。我是用'runserver'命令来启动服务器的。
我是不是漏掉了什么?
5 个回答
我找到了一种简单快捷的方法,可以在开发过程中提供项目的全局静态文件:
- 首先,创建一个新的应用程序,用来存放你的项目静态文件(比如,可以用命令“manage.py startapp static_content”来创建)。
- 在这个应用程序里创建一个叫做'静态'的文件夹,然后把你的静态文件放进去。
- 最后,把你新创建的应用程序添加到已安装应用程序的列表中。
如果你只想要解决方案 - 请滚动到“解决方案”部分。
概述
我昨天也遇到了同样的问题。以下是我发现的内容:
你只需要一个合适的静态文件查找器,它能找到你的 STATIC_ROOT 及其所有内容,但目前没有这样的查找器。这里是默认的查找器:
django.contrib.staticfiles.finders.AppDirectoriesFinder - 在安装的 Django 应用程序目录中搜索 'static' 文件夹,但现在大多数应用程序使用的是过时的 'media' 文件夹。
django.contrib.staticfiles.finders.FileSystemFinder - 使用 STATICFILES_DIRS 中提到的所有目录,但你不能把 STATIC_ROOT 加进去。
django.contrib.staticfiles.finders.DefaultStorageFinder - 在你的 DEFAULT_FILE_STORAGE 中搜索静态文件,默认是 django.core.files.storage.FileSystemStorage,它指向你的 MEDIA_ROOT。
解决方案
就这些,没有其他选择。目前(在 Django 1.3 中)没有办法使用 STATIC_ROOT。
所以我自己写了一个自定义的查找器来满足这个需求:
我的自定义静态查找器文件:finders.py:
from django.core.files.storage import FileSystemStorage from django.contrib.staticfiles.finders import BaseStorageFinder from django.conf import settings class StaticFinder(BaseStorageFinder): storage = FileSystemStorage(settings.STATIC_ROOT, settings.STATIC_URL)
settings.py:
STATICFILES_FINDERS = ( 'finders.StaticFinder', )
- 如果你想和其他查找器一起使用,建议把它放在 STATICFILES_FINDERS 中的后面。
请记住:这个解决方案只应该在开发中使用,绝不要在生产环境中使用!
我强烈建议你阅读这里的使用说明文档:http://docs.djangoproject.com/en/dev/howto/static-files/
简单来说:STATIC_ROOT 只有在你使用 collectstatic 管理命令时才会用到。你不需要把这个目录添加到 STATICFILES_DIRS 设置中来提供你的静态文件!
在开发阶段(当使用自动提供视图时),静态文件会自动在多个地方寻找静态文件(因为你调用了它的“serve”视图并提供了静态文件的路径)。为了进行这个搜索,它会使用所谓的“查找器”(这些在 STATICFILES_FINDERS 设置中定义)。
其中一个默认的查找器是 AppDirectoriesFinder,它会在你 INSTALLED_APPS 设置中每个应用的“/static/”目录下寻找。
另一个默认的查找器是 FileSystemFinder,它会在你在 STATICFILES_DIRS 设置中指定的目录中寻找。
顺便说一下,这两种搜索方式和模板加载的方式是类似的。
当运行 collectstatic 命令时,也会使用相同的技术,只不过这次它会从不同的地方收集文件(使用上面提到的查找器),并把找到的文件放到 STATIC_ROOT 中,准备好进行部署。