Django staticfiles应用程序的帮助
我有Django的staticfiles应用程序的一个小问题。
我已经添加了
'django.contrib.staticfiles',
到我的INSTALLED_APPS并添加
STATIC_URL = '/static/' STATIC_ROOT = '/Users/kevdotbadger/django/mylook/static/'
到我的settings.py
文件。
我所有的静态文件都位于Mac的STATIC_ROOT
文件夹中。
现在,我使用我的模板
{{ STATIC_URL }}
正确呈现给/static/
。
然而
{{ STATIC_URL }}css/style.css
导致404错误。 我使用'runserver'命令作为服务器。
有什么我失踪?
我恳请您阅读这里的howto文档: http : //docs.djangoproject.com/en/dev/howto/static-files/
简而言之:只有在您调用collectstatic manangement命令时才使用STATIC_ROOT。 不需要将目录添加到STATICFILES_DIRS设置来为您的静态文件提供服务!
在开发过程中(当使用自动服务视图时),静态文件将自动在各个位置查找静态文件(因为您使用静态文件的path调用其“服务”视图)。 对于这个search,它将使用所谓的“finders”(在STATICFILES_FINDERS设置中定义)。
-
其中一个默认的查找器是AppDirectoriesFinder,它将查找你的每个应用程序INSTALLED_APPS设置的“/ static /”目录。
-
另一个默认查找器是FileSystemFinder,它将查找您在STATICFILES_DIRS设置中指定的目录。
顺便说一句,这两种search模式都与模板加载的工作方式类似。
运行collectstatic命令时将使用相同的技术,只不过它现在将从各个位置收集文件(使用与上面相同的查找器),将find的文件放入STATIC_ROOT,准备部署。
如果你只想要一个解决scheme – 向下滚动到“解决scheme”。
概观
昨天我发现了同样的问题。 这是我发现的:
所有你需要的是适当的静态发现者,这将find你的STATIC_ROOT及其所有内容,但没有这样的发现者。 这里是默认的发现者:
-
django.contrib.staticfiles.finders.AppDirectoriesFinder – 为'静态'文件夹search已安装的django应用程序目录,但其中大多数目前使用过时的“媒体”文件夹。
-
django.contrib.staticfiles.finders.FileSystemFinder – 使用STATICFILES_DIRS中提到的所有dirs,但不能将STATIC_ROOT添加到它。
-
django.contrib.staticfiles.finders.DefaultStorageFinder – 在DEFAULT_FILE_STORAGE中search静态,默认为django.core.files.storage.FileSystemStorage ,它指向你的MEDIA_ROOT
解
这就是全部,没有额外的select。 现在没有select使用STATIC_ROOT(在Django 1.3中)。
所以我刚刚写了我自己的定制发现者为这些需要:
-
我的自定义静态查找器文件: 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', )
- 如果你想用另一个发现者 – 我build议把它放在STATICFILES_FINDERS里面
请记住 :这个解决scheme只能用于开发需求,而不能用于生产!
我发现了一个快速简单的解决方法来在开发过程中为项目全局静态文件提供服务:
- 开始一个新的应用程序,其中包含您的项目静态文件(例如“manage.py startapp static_content”)
- 在该应用程序中创build一个名为“静态”的文件夹,并将静态文件放在那里。
- 将您的新应用添加到已安装应用的列表中
首先,确保您的urls.py仅在开发中启用了静态服务 。
另外,你可能在那里有额外的斜线。 如果你的STATIC_URL =='/ static /',那么
{{STATIC_URL}} / css / style.css应该是{{STATIC_URL}} css / style.css。
STATIC_ROOT = '/home/ws/be/bla/' STATICFILES_DIRS = ('/home/ws/be/static/',) STATIC_URL = '/static/'
这对我有用。 STATIC_ROOT必须与STATICFILES_DIRS不同(Django版本1.4 pre-alpha SVN-16436)