为什么DEBUG = False设置使我的django静态文件访问失败?

nem*_*ixx 321 django django-views django-staticfiles

我正在使用Django作为我的主力来构建应用程序.到目前为止一直都很好 - 指定数据库设置,配置静态目录,网址,视图等.但是,当我想要渲染我自己的美丽和自定义404.html和500.html页面时,麻烦开始潜行.

我阅读了有关自定义错误处理的文档,并在UrlsConf中设置了必要的配置,创建了相应的视图,并将404.html和500.html添加到了我的应用程序的模板目录(也在settings.py中指定).

但是文档说you can actually view custom error views until Debug is Off,所以我确实把它关掉来测试我的东西,那就是什么东西变得狂暴!

我不仅无法查看自定义404.html(实际上,它加载,但因为我的错误页面每个都包含一个图形错误消息 - 一些不错的图像),错误页面的源加载,但没有其他任何加载!甚至没有链接CSS或Javascript!

通常,一旦我设置DEBUG = False,所有视图将加载,但任何链接的内容(CSS,Javascript,图像等)将不会加载!发生了什么?关于静态文件和DEBUG设置有什么遗漏吗?

Dmi*_*nko 440

如果您仍然需要在本地服务器静态(例如,无需调试进行测试),您可以在不安全模式下运行devserver:

manage.py runserver --insecure
Run Code Online (Sandbox Code Playgroud)

  • 虽然此标志确实有效,但它不提供collectstatic文件夹中的内容 (5认同)
  • 有人能告诉我这件事有什么不安全的地方吗 (4认同)
  • @KaviVaidya - 它只是不安全,因为它没有经过仔细检查以确信它是安全的。有关详细信息,请参阅 /sf/answers/2176839661/。恕我直言,这是一个非常糟糕的命名选择,将安全性的 FUD 与明显的性能限制混为一谈。 (3认同)
  • 这太神奇了.先生,谢谢你,你是英雄.这个答案应该与已接受的答案合并,因为它解决了问题,而不必使用除django本身以外的其他方式提供静态. (2认同)

Mar*_*ota 318

关闭调试后,Django将不再为您处理静态文件 - 您的生产Web服务器(Apache或其他东西)应该处理这个问题.

  • 我发现这个答案非常有帮助.以防万一其他人处于相同的情况(使用Google App Engine和非内部django的应用程序):不要忘记更新app.yaml. (5认同)
  • 处理程序: - url:/ static static_dir:static (3认同)
  • 对我来说没有意义。我想用 Debug=False 在本地测试它 (3认同)
  • 这实际上解决了我的好奇心,所以现在这很有意义,如果需要的话,我的确可以使用Apache来解决。我以为自己的设置有问题。谢谢 (2认同)
  • `manage.py runserver --insecure` 适用于使用 debug=True 提供静态文件 (2认同)

Joh*_*hao 30

您可以使用WhiteNoise在生产中提供静态文件.

安装:

pip install WhiteNoise
Run Code Online (Sandbox Code Playgroud)

并将您的wsgi.py文件更改为:

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)
Run Code Online (Sandbox Code Playgroud)

你很高兴去!

感谢车把创意博客.

但是,我们不建议在生产中以这种方式提供静态文件.您的生产Web服务器(如nginx)应该处理这个问题.

  • 请注意,在 WhiteNoise 版本 4.0 中,配置发生了变化。不要将这些行添加到 wsgi.py。相反,只需将“whitenoise.middleware.WhiteNoiseMiddleware”添加到中间件即可。请参阅变更日志中的[发行说明](http://whitenoise.evans.io/en/stable/changelog.html#v4-0) (8认同)
  • 听起来很有趣,但仅通过将该行添加到 `wgsi.py` 文件中对我不起作用。您链接的文档似乎提供了使用 WhiteNoise 的其他说明。将尝试其他方式并在此处为您更新。 (2认同)

小智 21

在urls.py中我添加了这一行:

from django.views.static import serve 
Run Code Online (Sandbox Code Playgroud)

在urlpatterns中添加这两个url:

url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}), 
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}), 
Run Code Online (Sandbox Code Playgroud)

当DEBUG = FALSE时,静态和媒体文件都是可访问的.
希望能帮助到你 :)

  • 现在将 `url(` 替换为 `re_path(` (15认同)
  • 惊人的!不要忘记设置STATIC_ROOT和manage.pycollectstatic。 (4认同)
  • 截至今天,这是唯一有效的方法!+1 (3认同)
  • 这实际上在应用程序位于本地时有效,但在部署后就不起作用 (2认同)

j_s*_*syk 17

如果在开发中使用静态服务视图,则必须具有DEBUG = True:

警告

这只有在DEBUG为True时才有效.

那是因为这种观点非常低效,而且可能不安全.这仅适用于本地开发,不应在生产中使用.

文档:在开发中提供静态文件

编辑:您可以添加一些网址来测试您的404和500模板,只需在您的网址中使用通用视图direct_to_template.

from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    ('^404testing/$', direct_to_template, {'template': '404.html'})
)
Run Code Online (Sandbox Code Playgroud)


Dar*_*nus 13

约翰尼的答案很棒,但仅仅通过添加那里描述的那些线仍然不适合我.基于这个答案,实际上对我有用的步骤在哪里:

  1. 按照描述安装WhiteNoise:

    pip install WhiteNoise
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建STATIC_ROOT变量并将WhiteNoise添加到MIDDLEWARE变量中settings.py:

    #settings.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise
        'django.contrib.sessions.middleware.SessionMiddleware',
        ...
    ]
    
    #...
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ##specify static root
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,wsgi.py按照Johnny的回答中的说明修改您的文件:

    #wsgi.py
    from django.core.wsgi import get_wsgi_application
    from whitenoise.django import DjangoWhiteNoise
    
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 之后,将您的更改部署到您的服务器(使用git或您使用的任何内容).

  5. 最后,collectstaticmanage.py服务器上运行该选项.这会将静态文件夹中的所有文件复制到STATIC_ROOT我们之前指定的目录中:

    $ python manage.py collectstatic
    
    Run Code Online (Sandbox Code Playgroud)

    您现在将看到一个staticfiles包含此类元素的新文件夹.

执行完这些步骤后,您现在可以运行服务器,并且可以在生产模式下查看静态文件.

更新:如果您的版本<4,则更改日志表明不再需要WSGI_APPLICATION = 'projectName.wsgi.application'在您的settings.py文件上声明.


Rob*_*low 11

实际上,您可以在生产Django应用程序中安全地提供静态文件DEBUG=True.

而不是使用Django本身,在WSGI文件(github)中使用dj_static:

# requirements.txt:

...
dj-static==0.0.6


# YOURAPP/settings.py:

...
STATIC_ROOT = 'staticdir'
STATIC_URL = '/staticpath/'

# YOURAPP/wsgi.py:

...
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())
Run Code Online (Sandbox Code Playgroud)

  • 我已经发现[whitenoise](http://whitenoise.evans.io/en/stable/),它可能更全功能. (2认同)

小智 11

从这里我通过混合一些答案来寻求帮助。在这里,我添加了我的全部部分。[我这样做是为了初学者的帮助以及我将来的使用]

首先的问题是为什么Debug=False需要!我把我的项目放在AWS中,几个小时后由于内存泄漏,连接超时。一开始我想到了芹菜。[当然我只是一个初学者]然后我把DEBUG=False我们DEBUG=True可以看到的安全警告放在settings.py中

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
Run Code Online (Sandbox Code Playgroud)

一旦我这样做了,我的静态文件就无法在网页中成功加载。然后我到处搜索,首先尝试从这里使用 --insecure 命令来运行服务器。

python manage.py runserver --insecure
Run Code Online (Sandbox Code Playgroud)

这是成功的,但我不希望我的项目在生产时使用不安全模式。作为正确的解决方案[根据我],我按照以下步骤操作。

首先,我更正了settings.py中的静态 URL、root 和 dir

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Run Code Online (Sandbox Code Playgroud)

然后通过命令收集静态文件

python manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)

现在是第二步,[这里也提供了]首先在命令行中的项目目录中安装whitenoise

pip install whitenoise
Run Code Online (Sandbox Code Playgroud)

然后在 settings.py 的中间件列表中添加“whitenoise.middleware.WhiteNoiseMiddleware”。

应该将其添加到“django.middleware.security.SecurityMiddleware”下方以及所有其余中间件上方。这样您的中间件列表将如下所示:-

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', #after this line
    'whitenoise.middleware.WhiteNoiseMiddleware', #add it exactlyhere
    'django.contrib.sessions.middleware.SessionMiddleware', #before this
    '...'
]
Run Code Online (Sandbox Code Playgroud)

在已安装的应用程序顶部添加“whitenoise.runserver_nostatic”,以便您已安装的应用程序列表如下所示:-

INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    'django.contrib.admin',
    'django.contrib.auth',
    '...'
]
Run Code Online (Sandbox Code Playgroud)

完成后,您现在就可以在生产中提供静态文件了![我也在我当地的环境中做了]

只需使用 runserver 命令,就不会出现不安全或任何需要的情况。

python manage.py runserver
Run Code Online (Sandbox Code Playgroud)

繁荣!!!它对我有用。 哈哈哈。我知道我的天性有点幼稚,但我现在很高兴。

感谢在这里提供答案并帮助我的工作的所有人。


小智 9

最终解决方案:-
所以基本上当你设置 debug = False 时,Django 不想处理你的静态文件。
所以我们想要一些可以处理我们的文件的东西。
答案是白噪声。

  1. pip在您的环境中 安装whitenoise

  2. 在 settings.py 的中间件列表中添加“whitenoise.middleware.WhiteNoiseMiddleware” 。

    应该将其添加到“django.middleware.security.SecurityMiddleware”下方以及所有其余中间件上方。这样您的中间件列表将如下所示:-

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware',
        # add it exactlyhere
        'django.contrib.sessions.middleware.SessionMiddleware',
        '...'
    ]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在已安装的应用程序顶部添加“whitenoise.runserver_nostatic”,以便您已安装的应用程序列表如下所示:-

    INSTALLED_APPS = [
        'whitenoise.runserver_nostatic',
        'django.contrib.admin',
        'django.contrib.auth',
        '...'
    ]
    
    Run Code Online (Sandbox Code Playgroud)

完成后,您现在就可以在生产中提供静态文件了!


Ser*_*hko 7

只需打开你的项目urls.py,然后找到这个if语句.

if settings.DEBUG:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Run Code Online (Sandbox Code Playgroud)

您可以在True上更改settings.DEBUG,它将始终有效.但如果您的项目是严肃的,那么您应该考虑上面提到的其他解决方案.

if True:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Run Code Online (Sandbox Code Playgroud)

在django 1.10中你可以这样写:

urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]
Run Code Online (Sandbox Code Playgroud)

  • 你的代码是正确的,但是在Django 1.10中,配置是针对媒体和静态的:urlpatterns + = [url(r'^ media /(?P <path>.*)$',serve,{'document_root':settings .MEDIA_ROOT,}),url(r'^ static /(?P <path>.*)$',serve,{'document_root':settings.STATIC_ROOT}),] (3认同)

Con*_*ado 5

您可以用许多不同的方式调试它。这是我的方法。

localsettings.py:

DEBUG = False
DEBUG404 = True
Run Code Online (Sandbox Code Playgroud)

urls.py:

from django.conf import settings
import os

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
    )
Run Code Online (Sandbox Code Playgroud)

请务必阅读文档;)

https://docs.djangoproject.com/zh-CN/2.0/howto/static-files/#limiting-use-to-debug-true


Ali*_*jad 5

这正是您必须在终端上输入才能在没有 DEBUG = TRUE 的情况下运行您的项目,然后您会看到所有资产(静态)文件都在本地服务器上正确加载。

python manage.py runserver --insecure 
Run Code Online (Sandbox Code Playgroud)

--insecure : 这意味着您可以在没有安全模式的情况下运行服务器