【发布时间】:2020-08-04 22:14:55
【问题描述】:
我想在我的 django API(也使用 rest 框架)中更新 post Request 中 json body 值的值,现在我正在尝试使用自定义中间件来执行此操作。这是我的中间件。
def CustomMiddleware(get_response):
def middleware(request):
print('request: ', request, ' type: ', type(request), ' vars: ', vars(request))
print('request: ', request.body)
body = json.loads(request.body)
body['attr'] = str(body['attr'])+'abc'
request.body = json.dumps(body)
response = get_response(request)
return response
return middleware
所以当我向我的 API 发出 POST 请求时,我收到了这个错误:
File "/path/models_masking/mask_middleware.py", line 37, in middleware
request.body = json.dumps(request_updated)
AttributeError: can't set attribute
我阅读并发现 request 对象是不可变的,所以我不确定我是否能够复制到请求对象,修改副本然后将其发送到 get_response 函数,或者也许有更好的方法来做到这一点,也许是我的 APIView 类的装饰器。
谁能帮我解决这个问题?
编辑
'attr'+'abc' 的值是在代码库的许多部分中使用的新值,我的核心问题是我不想在很多函数中更改该值在很多请求端点中,所以我的第一个想法是更新请求的值以在所有请求中自动更改“attr”的值,而不是更新每个请求。
这可能是一个新问题,但如果有人能为我的问题提供更好的解决方案,我将不胜感激。
【问题讨论】:
-
为什么要这么做,能给个示例视图吗?
-
更改请求的正文看起来很“奇怪”。
HttpRequest不是完全不可变的,例如.user是由中间件添加的。但是,更改请求正文看起来很“奇怪”。 -
您确定不想对每个请求都执行此操作吗?
-
@IainShelvington 是的,基本上请求中的数据是以某种方式被加密的,实际上在许多请求中,我不想在我认为的所有 POST 或 PUT 函数中手动解密,那就是为什么我试图在中间件中更改身体的数据。
-
@IainShelvington 一个视图就像 ``` from models import Person class MyView(APIView): def post(self, request, *args, **kwargs): # this attr var will be the concat with 'abc' attr = request.body['attr'] Person.objects.get(attr=attr) ```
标签: django python-3.6 django-middleware