当你发布你的 Django 或 Wagtail 或 CoderedCMS 网站后,设置 DEBUG=False 后,访问网站时会出现 Bad Request (400) 错误。

Bad Request (400):表示服务器由于语法无效或缺少信息而无法理解请求。

Django 或 Wagtail 或 CoderedCMS 网站出现 Bad Request (400) 的基本原因在于,设置 DEBUG=False 后,网站安全特性会加强,以防止生产环境中的潜在漏洞。但是,如果没有对代码或配置进行相应的调整,可能会导致意想不到的错误。

本文将介绍如何在 Django 或 Wagtail 或 CoderedCMS 网站中解决 Bad Request (400) 错误。

Django 或 Wagtail 或 CoderedCMS 网站中出现 Bad Request (400) 错误可以从一下三个方面解决:

配置 ALLOWED_HOSTS

Django 或 Wagtail 或 CoderedCMS 网站要求你指定允许访问你的应用程序的有效主机名或域名。默认情况下,使用DEBUG=True,任何主机名都可以访问该应用程序。

当设置 DEBUG=False 后,您需要在 settings.py 中显式地配置 ALLOWED_HOSTS。添加一个包含您允许的主机名的列表,只有 URL 地址中主机信息在该列表中,才允许访问。

添加 ALLOWED_HOSTS 配置:

在配置文件中添加如下信息(你需要根据自己的网站修改):

DEBUG = False

ALLOWED_HOSTS = [
    'yourdomain.com',
    'your_ip',
    'localhost',  # 如果需要在本地调试
    '127.0.0.1',  # 如果需要在本地调试
]

配置代理服务器

如果你在 Django 请求前使用代理服务器(比如 Nginx ),它可能会修改请求中的 Host 头。Django 可能无法识别修改后的头文件,从而导致 400 错误。

配置代理服务器以设置正确的主机头信息。例如,在 Nginx 中,添加 proxy_set_header Host $host; 到您的服务器配置中。

另外,在 settings.py 中启用 USE_X_FORWARDED_HOST = True,告诉 Django 或 Wagtail 信任 X-Forwarded-Host 头(如果由代理设置)。

修改配置

在配置文件添加如下配置:

USE_X_FORWARDED_HOST = True

在 Nginx 的配置文件中添加如下配置:

server {
    listen 80;
    server_name yourdomain.com;  # 修改为您的域名

    location / {
        proxy_pass http://127.0.0.1:8000/;  # 修改为您的地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;  # 可选
    }
}

CSRF 保护机制

Django 内置的 CSRF (跨站点请求伪造)保护有助于防止恶意攻击。当使用 POST 方法( <form method=" POST "> )提交表单时,需要在表单或 AJAX 请求中包含一个 CSRF 令牌。

使用 {% csrf_token %} 模板标签或 Django REST 框架中的适当方法确保您的表单具有 CSRF 令牌。有关 CSRF 保护的具体说明,请参阅 Django 文档。

添加 CSFRF 令牌

使用 Django 标签的方式:

<form method="post">
  {% csrf_token %}  # 用于生成以包含 CSRF 令牌信息的 <input> 元素
  ...
  <button type="submit">提交</button>
</form>

使用 Django REST Framework:

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class MyAPIView(APIView):
    permission_classes = [IsAuthenticated]  # Optional for authenticated users only

    def post(self, request, *args, **kwargs):
        # Assuming you have a serializer for your data
        serializer = MySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

结语

本文从三个方面介绍如何在 Django 或 Wagtail 或 CoderedCMS 网站中解决 Bad Request (400) 错误。