设置DEBUG = False会导致500错误

时间:2013-02-28 05:27:06

标签: django settings django-1.5

更改DEBUG = False后,我的网站将生成500(使用wsgi& manage.py runserver),并且Apache错误日志中没有错误信息,当我更改{{1时,它将正常运行转到debug

我正在使用Django 1.5& Python 2.7.3 这里是Apache访问日志,没有任何登录apache错误日志

True

这是我的设置文件:

www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET / HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET /favicon.ico HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET /favicon.ico HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"

30 个答案:

答案 0 :(得分:408)

Django 1.5引入了出于安全原因所需的allowed hosts setting。使用Django 1.5创建的设置文件包含您需要添加的新部分:

# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.9/ref/settings/#allowed-hosts
ALLOWED_HOSTS = []

在此处添加您的主机,例如['www.beta800.net']['*'],以便进行快速测试,but don't use ['*'] for production

答案 1 :(得分:39)

我知道这已经很晚了但我最终在这里搜索了我的错误500 DEBUG=False,在我的情况下,它确实是ALLOWED_HOSTS,但我使用{{1}填充主机,我没有注意到这一点,直到我启用了日志记录,您可以使用以下内容将所有错误记录到文件中,即使在os.environ.get('variable')时也会记录:

DEBUG=False

答案 2 :(得分:21)

在我的情况下,阅读第三方应用程序的文档正确地保存了我。

罪魁祸首? django_compressor

我有

{% load compress %}
{% compress css %}
 ... css files linked here ..
{% endcompress %}

DEBUG = True总是给我500.要修复它,我需要在我的设置中使用一行才能让它运行

COMPRESS_ENABLED = os.environ.get('COMPRESS_ENABLED', False)

答案 3 :(得分:14)

我最近在Django 2.0中遇到了同样的问题。通过设置DEBUG_PROPAGATE_EXCEPTIONS = True,我能够找出问题所在。见这里:https://docs.djangoproject.com/en/2.0/ref/settings/#debug-propagate-exceptions

就我而言,错误是ValueError: Missing staticfiles manifest entry for 'admin/css/base.css'。我通过本地运行python manage.py collectstatic来解决这个问题。

答案 4 :(得分:13)

是的,在Django 1.5中,如果DEBUG = False,请配置ALLOWED_HOSTS,添加没有端口号的域。例如:

ALLOWED_HOSTS = ['localhost']

答案 5 :(得分:10)

您还必须检查遍布各处的网址。当DEBUG设置为False时,所有不带尾随/的网址都会被视为错误,与DEBUG = True不同,在这种情况下,Django会追加/它无处不在。因此,简而言之,确保所有链接都以斜线结束。

答案 6 :(得分:7)

我有一个热闹的故事。到达这个页面后,我说“尤里卡!我得救了。那一定是我的问题。”所以我在setting.py中插入了所需的ALLOWED_HOSTS列表,并且......没有。相同的旧500错误。不,这不是因为缺少404.html文件。

因此,在2天的时间里,我忙于疯狂的理论,例如它与提供静态文件有关(理解我是菜鸟,而且不知道他们在做什么)。

那是什么?现在是主持人,我们得到了一个有用的提示。虽然我的开发Django是版本1.5.something,我的生产服务器版本是1.5.something + 1 ...或者可能加上2.无论如何。因此,我将ALLOWED_HOSTS添加到 settings.py 的桌面版本(缺少hwjp请求的内容) - “settings.py中的默认值,可能带有解释性注释” ---我在生产服务器上使用适当的域做了同样的事情。

但是我没注意到在使用更高版本的Django的生产服务器上,在settings.py中有一个带有解释性注释的默认值。它远远低于我进入的地方,在显示器上看不到。当然,这份清单是空的。因此我浪费时间。

答案 7 :(得分:6)

对于它的价值 - 我只在某些页面上获得了500 DEBUG = False。使用pdb追溯异常显示缺少资产(我怀疑{% static ... %}模板标记是500的罪魁祸首。

答案 8 :(得分:5)

当我DEBUG = FALSE时,我遇到了同样的问题。这是一个综合解决方案,分散在上面的答案和其他帖子中。

默认情况下,在settings.py中我们有ALLOWED_HOSTS = []。以下是根据场景可能需要在ALLOWED_HOSTS值中进行的更改以消除错误:

1:您的域名:

ALLOWED_HOSTS = ['www.example.com'] # Your domain name here

2:如果您还没有域名,那么您已部署的服务器IP(这是我的情况并且像魅力一样工作):

ALLOWED_HOSTS = ['123.123.198.123'] # Enter your IP here

3:如果您在本地服务器上进行测试,则可以将settings.pysettings_local.py编辑为:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

4:出于安全原因,您还可以在ALLOWED_HOSTS值中提供'*',但在生产环境中不推荐

ALLOWED_HOSTS = ['*'] # Not recommended in production environment

我还在blog上发布了您可能想要推介的详细解决方案。

答案 9 :(得分:5)

补充主要答案
在开发和生产之间切换时,更改settings.py中的ALLOWED_HOSTS和DEBUG全局常量很烦人。 我正在使用此代码自动设置这些设置:

import socket

if socket.gethostname() == "server_name":
    DEBUG = False
    ALLOWED_HOSTS = [".your_domain_name.com",]
    ...
else:
    DEBUG = True
    ALLOWED_HOSTS = ["localhost", "127.0.0.1",]
    ...

如果您使用macOS,您可以编写更通用的代码:

if socket.gethostname().endswith(".local"): # True in your local computer
    DEBUG = True
    ALLOWED_HOSTS = ["localhost", "127.0.0.1",]
else:
    ...

答案 10 :(得分:4)

我正在搜索和测试更多有关此问题的内容,我意识到settings.py中指定的静态文件目录可能是导致此问题的原因,所以我们需要运行此命令

python manage.py collecstatic
在settings.py中的

,代码应如下所示:

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

答案 11 :(得分:2)

python manage.py collectstatic中设置DEBUG = FalseALLOWED_HOSTS = ['127.0.0.1']之后,您可能想运行settings.py。经过这两个步骤后,即使使用DEBUG = False模式,我的Web应用程序也可以在本地服务器上正常运行。

顺便说一句,我在settings.py中有这些设置。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # what i added
    'django.middleware.common.CommonMiddleware', # and so on...
]

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

我认为也许白噪声设置与collectstatic命令有关。

答案 12 :(得分:2)

我知道这是一个非常古老的问题,但也许我可以帮助其他人。如果在设置DEBUG = False后出现500错误,则可以始终在命令行中运行manage.py runserver,以查看任何Web错误日志中不会出现的错误。

答案 13 :(得分:1)

感谢@squarebear,在日志文件中,我发现了错误: ValueError: The file 'myapp/styles.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage ...>

我的django应用程序中有一些问题。我删除了线路  我从heroku的文档中找到了STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

我还必须在django应用程序的根目录中添加额外的目录(感谢another SO answerstatic myapp/static,即使我没有使用它。然后在运行服务器之前运行命令python manage.py collectstatic解决了问题。最后,它开始正常工作。

答案 14 :(得分:1)

我认为它也可能是http服务器设置。矿井仍然破碎,整个时间都是ALLOWED_HOSTS。我可以在本地访问它(我使用gunicorn),但在DEBUG = False时不能通过域名访问它。当我尝试使用域名它然后给我错误,所以让我认为它是一个与nginx相关的问题。

这是我的nginx配置文件:

server {
    listen   80;
    server_name localhost myproject.ca www.myproject.ca;
    root /var/web/myproject/deli_cms;

    # serve directly - analogous for static/staticfiles
    location /media/ {
        # if asset versioning is used
        if ($query_string) {
            expires max;
        }
    }
    location /admin/media/ {
        # this changes depending on your python version
        root /var/web/myproject/lib/python2.6/site-packages/django/contrib;
    }
    location /static/ {
    alias /var/web/myproject/deli_cms/static_root/;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8000/;
    }
    # what to serve if upstream is not available or crashes
    error_page 500 502 503 504 /media/50x.html;
}

答案 15 :(得分:1)

这也许可以帮助其他人,就我而言,缺少图标图标的问题。

答案 16 :(得分:1)

我开始以

的形式获得debug = False的500
django.urls.exceptions.NoReverseMatch: Reverse for 'home' not found.
or...
django.urls.exceptions.NoReverseMatch: Reverse for 'about' not found.

在引发 django.core.exceptions.ValidationError 而不是引发 rest_framework.serializers.ValidationError

公平地说,它之前已经提高了500,但是作为ValidationError(带有debug = False),将其更改为NoReverseMatch。

答案 17 :(得分:1)

我遇到了这个问题。事实证明,我使用import React from 'react'; import {Field, reduxForm, values, getFormValues } from 'redux-form'; import {connect} from "react-redux"; import validate from '../middleware/validate'; const FetchValues = connect(state => ({ values: getFormValues('wizard')(state), }))(({ values }) => <div> <p>Check if everything is alright.</p> <div className="row"> <div className="col-xs-12"> <h6>Your Name</h6> </div> <div className="col-xs-12"> <p>{values.name}</p> </div> </div> <div className="row"> <div className="col-xs-12"> <h6>Are you part of a family?</h6> </div> <div className="col-xs-12"> <p>{values.familyFlag}</p> </div> </div> </div>) let WizardFormPreview = (props) => { const {handleSubmit, pristine, previousPage, submitting} = props; return ( <form onSubmit={handleSubmit} className="form-horizontal"> <div className="step-3"> <FetchValues/> <div> <button type="button" className="previous" onClick={previousPage}> Previous </button> <button type="submit" disabled={pristine || submitting}>Submit</button> </div> </div> </form> ); }; export default reduxForm({ form: 'wizard', destroyOnUnmount: false, forceUnregisterOnUnmount: true, validate, })(WizardFormPreview); 模板标签在模板中包含了一个不再存在的文件。在日志中查看我的问题。

我想这只是导致此类错误的众多可能原因之一。

故事的道德:始终记录错误并始终检查日志。

答案 18 :(得分:1)

我有类似的问题,在我的情况下,它是由body标签内部的一个Commented脚本引起的。

<!--<script>  </script>-->

答案 19 :(得分:0)

我有一个视图在debug = false中抛出500错误但在debug = true中工作。对于任何正在获得此类事情并且允许主机不是问题的人,我通过更新模板指向错误位置的静态标记来修复我的视图。

所以我建议只检查链接和标签在所使用的任何模板中都是密不透风的,也许某些东西在调试时会漏网,但在生产中会出错。

答案 20 :(得分:0)

我知道这是一个老问题,但是当DEBUG = False时我也遇到了500错误。几个小时后,我意识到我忘了用一个尾部斜杠结束我的ba​​se.html中的一些链接。

答案 21 :(得分:0)

当DEBUG = False时,我发现500错误的另一个原因。我使用Django compressor实用程序,我们的前端工程师在Django模板中添加了里面 compress css块中的字体文件。像这样:

{% compress css %}
    <link href="{% static "css/bootstrap.css" %}" rel="stylesheet">
    <link href="{% static "css/bootstrap-spinedit.css" %}" rel="stylesheet">
    <link href="{% static "djangular/css/styles.css" %}" rel="stylesheet">
    <link href="{% static "fonts/fontawesome-webfont.ttf" %}" rel="stylesheet">
{% endcompress %}

解决方案是将链接移至ttf行下方的endcompress文件。

答案 22 :(得分:0)

需要注意的一件小事,如果数组中包含None,则忽略所有后续允许的主机。

ALLOWED_HOSTS = [
    "localhost",
    None,
    'example.com', # First DNS alias (set up in the app)
    #'www.example.com', # Second DNS alias (set up in the app)
]

Django version 1.8.4

答案 23 :(得分:0)

现在是2019年中期,在与Django一起开发了几年之后,我遇到了这个错误。让我困惑了一整晚!不允许主机(应该抛出400),其他所有内容都检出了,最后做了一些错误记录,只是发现某些丢失的或混乱的静态文件清单(在collectstatic之后)正在搞乱安装程序。长话短说,对于那些为难而又正在使用WHEITENOISE或带有CACHE的DJANGO STATICFILE后端(清单静态文件)的人来说,也许这是给您的。

  1. 请确保您设置了所有内容(就像我对白噪声后端所做的一样……尽管如此,Django后端仍在读取)http://whitenoise.evans.io/en/stable/django.html

  2. 如果错误代码500仍然使您失望,请注意您的设置。STATICFILES_STORAGE。

将其设置为任一(用于压缩后的白噪声后端)

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

或(保留为django默认值)

STATICFILES_STORAGE = django.contrib.staticfiles.storage.StaticFilesStorage

总而言之,问题似乎来自这个白噪声缓存+压缩后端->

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

或django自己的缓存后端->

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

... didnt对我来说效果很好,因为我的CSS引用的是其他一些源,这些源可能在collectstatic /后端缓存期间混在一起。 http://whitenoise.evans.io/en/stable/django.html#storage-troubleshoot

中也可能会突出显示此问题

答案 24 :(得分:0)

我有一个与此类似的问题,我将报告我如何解决我的问题,因为可能有人也遇到了同样的问题。

在我的情况下,该错误是由于服务器未从首页中找到一些静态文件引起的。

因此,请确保错误仅发生在index或另一页上。如果仅在索引中出现问题,则很有可能需要检查静态文件。我建议打开Chrome预览控制台并检查是否有错误。

在我的情况下,找不到服务器favicon.ico和另外两个CSS。

通过更正此问题,我给了python manage.py collecstatic并更正了问题。

答案 25 :(得分:0)

派对有点晚了,当然可能会出现大量问题,但我遇到了类似的问题,结果发现我的html评论中有{%}}个特殊字符...

<!-- <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/> -->

答案 26 :(得分:0)

我知道这篇文章已经很老了,但是今天仍然十分相关。

对于它的价值-我在网站上的所有页面上都获得DEBUG = False的500分。

在调试时我没有回溯。

我必须遍历网站模板中的每个静态链接,并在图像源前面找到一个/(正斜杠)。 {% 静态的 ... %}。这在DEBUG = False中引起了500错误,但在Debug = True中则正常工作,没有错误。很烦人!被警告!由于正斜杠浪费了很多时间...

答案 27 :(得分:0)

这是旧的,我的问题最终与问题有关,但不是OP,但我的解决方案是针对其他任何尝试上述操作无效的人。

我在Django的修改版本中设置了一个设置来缩小仅在DEBUG关闭时运行的CSS和JS文件。我的服务器没有安装CSS minifier并抛出错误。如果您使用的是Django-Mako-Plus,这可能是您的问题。

答案 28 :(得分:-5)

如果您想允许所有主机。 使用ALLOWED_HOSTS = ['*',] 代替 ALLOWED_HOSTS = ['*']

答案 29 :(得分:-5)

在尝试了很多事情之后,正确的解决方法是...

您需要设置DEBUG = 'FALSE'而不是FalseFALSE,而是将'FALSE'''设置