【问题标题】:Django static files won't loadDjango 静态文件不会加载
【发布时间】:2012-04-30 07:17:06
【问题描述】:

我是 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 的静态内容。任何人都可以对此有所了解吗?

【问题讨论】:

    标签: python django static django-static


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您的问题是您没有在 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”中以使用仅限开发人员的规则,但这根本不需要,实际上我认为这是一个糟糕的建议。

        【讨论】:

        • 好吧,实际上在后一种情况下,有必要包装该规则。如果您查看 django 的代码,您会发现视图没有对 DEBUG 进行任何检查。
        • 视图永远不会被命中,因为您的网络服务器设置为捕获这些并提供静态文件,因此无需检查。
        猜你喜欢
        • 2017-10-08
        • 2019-02-23
        • 1970-01-01
        • 2017-04-08
        • 2017-11-08
        • 1970-01-01
        • 2019-01-21
        • 2018-11-16
        • 2020-09-10
        相关资源
        最近更新 更多