14

我是一个 Django 新手,正在处理我的第一个项目并且遇到了静态文件问题。

我创建了一个简单的身份验证系统,使用django.contrib.auth由两个模板组成:mysite/templates/index.htmlmysite/templates/registration/login.html. 我有全局静态内容mysite/static,我希望能够访问所有应用程序呈现的所有模板。

mysite/templates/index.html包含在我访问 url 时<img src="{{ STATIC_URL }}pics03.jpg"/>呈现为和加载良好的内容"static/pics03.jpg"localhost:8000/

mysite/templates/registration/login.htmlcontains当我访问 url 时<img src="{{ STATIC_URL }}pics03.jpg"/>,它也呈现为"static/pics03.jpg"并且不加载"localhost:8000/accounts/login/"

在我的 urls.py 中,我有:

urlpatterns = patterns('',
   url(r'^$', 'mysite.views.home'), # plays index.html template
   url(r'^accounts/login/$', 'django.contrib.auth.views.login'),

在我的 settings.py 中,我有:

PROJECT_DIR = os.path.dirname(__file__)

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,'static'),
)  

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

STATIC_URL = '/static/'

STATIC_ROOT = ''

我的印象是 Django 应该在 STATICFILES_DIRS 中查找全局静态内容,但即使我将其中的 url 更改为静态文件夹的绝对路径,它也找不到 login.html 的静态内容。任何人都可以对此有所了解吗?

4

3 回答 3

21

您的问题是您没有在 urls.py 中收听 URL“/static/”

如果您通过像 apache 或 nginx 这样的网络服务器为您的应用程序提供服务,那么这是正常的,因为网络服务器会自己处理静态文件。

对于开发,Django 自带一个内置的静态服务器

到 urls.py,最后添加

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()

它的作用是添加 /static/ url,让您在没有网络服务器的情况下提供服务。

这相当于

url(
    regex=r'^static/(?P<path>.*)$', 
    view='django.views.static.serve', 
    kwargs={'document_root': settings.STATIC_ROOT,}
)

有些人会告诉您,您需要将 URL 规则包装在“if settings.DEBUG”中以使用仅限开发人员的规则,但这根本不需要,实际上我发现这是一个坏建议。

于 2012-04-20T09:32:50.593 回答
1

您在使用 runserver 构建时遇到问题,还是使用 Apache 或类似工具提供服务?我在这方面有点挣扎。我遵循的文档是:https ://docs.djangoproject.com/en/stable/howto/static-files/

当您准备好部署时,第二部分是关键。您需要定义一个静态根(一开始为空)并运行manage.py collectstatic命令将静态文件从整个项目移动到该文件夹​​中。然后你可以从那里为他们服务。

于 2012-04-18T20:11:14.407 回答
0

改变STATIC_ROOT=''STATIC_ROOT='/'帮助吗?

在我看来,唯一的区别是static/pics03.jpg(相对路径)存在于主页上,但不存在于另一个上。

绝对路径/static/pics03.jpg在这两种情况下都存在。如果更改STATIC_ROOT没有帮助,只需/在网址的开头添加一个。

于 2012-04-18T21:23:51.843 回答