Django静态文件将无法加载

时间:2012-04-18 19:45:40

标签: python django static django-static

我是Django新手在我的第一个项目上工作并且遇到静态文件问题。

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

mysite/templates/index.html包含<img src="{{ STATIC_URL }}pics03.jpg"/>,其呈现为"static/pics03.jpg"并在我访问网址时加载正常localhost:8000/

mysite/templates/registration/login.html包含<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的静态内容。任何人都可以对此有所了解吗?

3 个答案:

答案 0 :(得分:19)

您的问题是您在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”中以使用dev-only规则,但这根本不需要,实际上我发现这是一个糟糕的建议。

答案 1 :(得分:1)

在runserver中使用构建时遇到问题,或者使用Apache或类似服务?我有点挣扎。我遵循的文档是:https://docs.djangoproject.com/en/dev/howto/static-files/

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

答案 2 :(得分:0)

STATIC_ROOT=''更改为STATIC_ROOT='/'会有帮助吗?

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

两种情况都存在绝对路径/static/pics03.jpg。如果更改STATIC_ROOT无效,只需在网址的开头添加/即可。