Django:重新编码请求并调用另一个视图

Django: reencode request and call another view

我正在开发一个公开 JSON-based REST api 的后端应用程序。但是,我正在使用一些具有自己的一些端点的库,它们接受 form-endcoded 数据。我想扩展这些端点完成的操作并公开我的扩展版本。同时,我希望我的 API 保持一致,并且我希望我所有的端点都使用 JSON。更具体地说,我使用 oauth2_provider 库,我想在用户撤销令牌时注销用户。我也在考虑制作一个 logout 句柄,它需要 Authorization header 中的承载令牌,并且会注销用户并撤销令牌。

我的第一个方法是围绕 oauth2_toolkit 撤销令牌视图编写包装视图,在包装视图中将用户注销,然后调用实际的 revoke_token 视图。但是,我必须修改请求的body,它是不可变的。

class Logout(View):
   def get(self, request):
       if request.user.is_authenticated:
           logout(request)
       # modify the .body attr of the request or create a new request here
       RevokeTokenView.as_view(request)

我找不到克隆或修改 Django 请求的方法。有办法吗? (现在我正在考虑创建自定义 oauthlib_backend_class,但感觉有点矫枉过正)

UPD: revoke_token视图需要的数据在request_body

您可以像下面这样修改不可变请求体:

class Logout(View):
   def get(self, request):
       if request.user.is_authenticated:
           logout(request)
       # modify or create a new request here
       body = request.GET.copy()
       body['key'] = 'new_value'
       request.GET = body
       RevokeTokenView.as_view(request)

更新:如果你想改变请求对象的.body属性,根据django's implementation,你应该改变._body request 对象的私有属性。