为什么我的静态目录在django 1.3中不起作用?

7 投票
3 回答
7459 浏览
提问于 2025-04-16 19:38

这个问题很简单,但我就是搞不明白。

我在我的网址模式中添加了这些内容:

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 个回答

0

你需要在settings.py文件中设置STATIC_URL。

在你的情况下,它应该是:

STATIC_URL = '/static/'
1

主要有两个步骤:

  1. 检查 STATIC_ROOT 路径:

    看看这个文件是否存在? /home/user/www/site/static/css/main.css 如果不存在,你需要运行 "python manage.py collectstatic" 来把静态文件复制到 STATIC_ROOT 路径。 如果 "collectstatic" 不能把 CSS 文件复制到 STATIC_ROOT 路径,那就要检查一下 "STATICFILES_DIRS" 中的源 CSS 路径。
  2. 在开发环境中(使用 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()
9

如果你在使用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来提供。

撰写回答