【问题标题】:Django failing to load 400.htmlDjango 无法加载 400.html
【发布时间】:2019-02-05 08:29:14
【问题描述】:

我为我的 Django 项目定义了错误 400 和 404 的自定义模板。当我尝试访问网站的生产版本时,错误 404 模板已正确加载缺失页面。但是,如果我向我的 Apache/Django 服务器发送错误请求(例如http://mysite.example.com/%),则不会加载错误 400 的模板,而是会呈现常规的 Apache 错误页面:

Bad Request

Your browser sent a request that this server could not understand.
Apache/2.4.18 (Ubuntu) Server at mysite.example.com Port 80

Apache 是否将这个请求转发给 Django,还是我需要在我的 Django 项目中定义 handler400 才能使其工作(尽管我不必为 404.html 这样做)?

【问题讨论】:

标签: python django python-3.x apache


【解决方案1】:

这里的关键点是您的 apache 充当了 usgi 服务器的代理。它将所有有效请求转发给 usgi,就 apache 而言,对不存在的请求的请求是有效请求,需要转发到 django 路由器 - 它将发现 url 映射不存在并引发 404 错误。此错误由 django 内部完成,并导致显示 django 404 页面。

当序列化程序无法验证传入的 json 请求时,一些请求,尤其是 django rest 框架会在内部产生 400 个响应。这些也会导致显示 django 400 页面。

但是如果请求本身格式不正确,它永远不会被转发到 usgi 服务器,django 也永远不会看到它。它将由 apache 在内部处理,因此显示 apache 400 html。

最简单的解决方案是将所有 apache 错误页面替换为相应的 django 页面(如果这些是模板,则渲染它们并保存 html)

【讨论】:

  • 我虽然是这样......有没有办法发送一个错误的请求(通过浏览器),该请求将从 Apache 传递到 uWSGI,然后我可以看到正确呈现的 html?
  • 我不是 apache 方面的专家,但我认为这是可能的。请根据http状态搜索RewriteRule或RewriteCond
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2014-10-29
  • 2015-11-10
  • 2021-10-12
  • 2017-03-12
  • 2021-04-08
相关资源
最近更新 更多