0

我正在开发一个公开基于 JSON 的 REST api 的后端应用程序。但是,我正在使用一些有自己的端点的库,它们接受表单结束编码的数据。我想扩展这些端点所做的操作并公开我的扩展版本。同时,我希望我的 API 保持一致,并且我希望我的所有端点都使用 JSON。更具体地说,我使用 oauth2_provider 库,并且我想在用户撤销令牌时注销用户。我还在考虑制作一个logout句柄,该句柄需要Authorization标头中的不记名令牌,并且会注销用户并撤销令牌。

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

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,但感觉有点矫枉过正)

UPDrevoke_token :视图需要的数据在request_body

4

1 回答 1

2

您可以修改不可变的请求正文,如下所示:

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 的实现,您应该更改作为对象._body私有属性的属性request

于 2020-02-06T12:49:29.400 回答