【问题标题】:Enabling CSRF for Django为 Django 启用 CSRF
【发布时间】:2023-02-20 22:07:12
【问题描述】:

我的 Django views.py 中有以下 python 代码,该代码采用 JSON 主体并将提取的数据发送到另一个 API 端点,我在此处简化了代码。

如何启用 csrf 以便它将令牌发送回此方法的调用方?我打电话给邮递员。

@csrf_protect
def validate_booking(request):
  if request.method != "POST":
    return HttpResponseServerError("Invalid HTTP method")
  body = json.loads(request.body)
  booking_details = body["booking_details"]

    DATA = {
      "name": booking_details["name"],
      "nric": booking_details["nric"],
      "booking_id": booking_details["booking_id"]
    }

  return HttpResponse(status="200")

该站点指示将这段代码放入我的方法中。但什么是“a_template.html”? https://docs.djangoproject.com/en/4.1/ref/csrf/

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render(request, "a_template.html", c)

【问题讨论】:

标签: python django csrf


【解决方案1】:

这不是一件容易的事,因为 CSRF 是 2 个步骤

  1. 有一个值传递给客户端,并保存到服务器上的会话中。
  2. 收到 POST 请求时,客户端应在正文中将其作为 csrfmiddlewaretoken 发送,服务器将根据服务器会话中存储的值检查该值。

    因此,这在 API 中是不可行的,因为您需要的会话管理不是 REST API 实现的。

【讨论】:

    【解决方案2】:

    感谢您的回复。我设法通过执行以下操作找到解决方案:

    1. 创建一个新的 GET 方法,它将使用 python 生成会话 CSRF 令牌
    2. 我没有使用需要 HTML 模板文件的渲染,而是使用 JsonResponse(data) 直接以 JSON 格式返回
    3. 在我使用标头中的 X-CSRFToken 发出 POST 请求的邮递员应用程序中,我将首先向我在步骤 1 中创建的新方法发出 GET 请求以检索令牌并将其存储为环境变量

      以下是 GET 方法示例:

      from django.http import JsonResponse
      
      def get_csrf_token(request):
          csrf_token = csrf(request)['csrf_token']
          data = {'csrf_token': csrf_token}
          return JsonResponse(data)
      

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2011-02-28
      • 2012-09-27
      • 2014-08-31
      • 2011-08-07
      • 2021-03-25
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多