为什么我的静态目录在django 1.3中不起作用?
这个问题很简单,但我就是搞不明白。
我在我的网址模式中添加了这些内容:
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/home/user/www/site/static'})
我的 main.css 文件的位置是:/home/user/www/site/static/css/main.css
当我访问 http://localhost:8000/static/ 时,
我看到的错误是:404:这里不允许目录索引。
当我访问 http://localhost:8000/static/css/main.css 时,
我看到的错误是:404:找不到 'css/main.css'。
我到底哪里做错了?
我解决了这个问题:
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT } ),
在 settings.py 文件中
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = os.path.join(CURRENT_PATH, 'static') #=='/home/user/www/site/static'
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/mystatic/'
如你所见,我唯一真正改变的就是把 STATIC_URL = '/static/' 改成了 STATIC_URL = '/mystatic/'。
注意:当我访问 http://localhost:8000/mystatic 时,我遇到的错误和之前一样。
我原以为 STATIC_URL 应该是 '/static/',这样在模板中可以使用 {{ STATIC_URL }}... 我真的不明白为什么这个修改有效,以及我为什么必须做这样的更改……
为什么这样就能解决问题呢?
3 个回答
你需要在settings.py文件中设置STATIC_URL。
在你的情况下,它应该是:
STATIC_URL = '/static/'
主要有两个步骤:
检查 STATIC_ROOT 路径:
看看这个文件是否存在? /home/user/www/site/static/css/main.css 如果不存在,你需要运行 "python manage.py collectstatic" 来把静态文件复制到 STATIC_ROOT 路径。 如果 "collectstatic" 不能把 CSS 文件复制到 STATIC_ROOT 路径,那就要检查一下 "STATICFILES_DIRS" 中的源 CSS 路径。在开发环境中(使用 runserver 启动网页服务器),确保:
a) 在 settings.py 文件中,INSTALLED_APPS 包含: 'django.contrib.staticfiles' b) 在 urls.py 文件中,urlpatterns += staticfiles_urlpatterns()
我猜你没有配置第二步的 b 部分。 你的方法应该是可以的,但它是硬编码的。
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT } ),
在 Django 的文档中已经提到过:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
如果你在使用Django自带的开发用网页服务器(也就是用 manage.py runserver
命令启动的),那么在开发的时候,Django会自动处理静态文件。
需要注意的是,STATIC_ROOT
是Django用来收集静态文件的路径,而不是用来提供文件的路径。你不需要自己去管理 STATIC_ROOT
!想了解更多,可以查看 Django的文档。
一般来说,在使用自带服务器时,你不需要在你的网址配置中添加 django.views.static.serve
。
静态文件应该放在其他地方,而不是 STATIC_ROOT
里。你可以把它们放在 myapp/static
这个路径下(也就是放在各个应用的静态文件夹里)。你也可以为整个项目专门设置一个静态文件夹(比如 /path/to/project/proj_settings
),然后在 settings.py
中更新 STATICFILES_DIRS
为:
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(PROJECT_DIR, 'proj_static'),
)
这样你就可以把你的 css/main.css
文件放在 /proj_static/css/main.css
里。Django自带的网页服务器会从那里提供 /static/
的内容。
在生产环境中,你应该通过运行 manage.py collectstatic
来把所有静态文件收集到 STATIC_ROOT
里。然后你可以直接通过你的网页服务器(比如nginx或Apache)来提供这个文件夹的内容,而不是通过Django来提供。