我已经有一个 django 项目,它的逻辑如下:
url: URL?username=name&pwd=passwd
查看:
def func(request):
dic = request.GET
username = dic.get("username")
pwd = dic.get("pwd")
但现在我们需要加密数据。然后,请求变成这样:
url: URL?crypt=XXXXXXXXXX(XXXXXXXX 是“username=name&pwd=passwd”的加密str)
所以我需要修改每个 View 函数。但是现在我想在 django 中间件中解密,以防止修改每个 View 函数。
但是当我修改 request.GET 时,我收到错误消息“此 QueryDict 实例是不可变的”。如何修改?
最佳答案
django.http.QueryDict
分配给 request.GET
和 request.POST
的对象是不可变的。
您可以通过复制将其转换为可变的 QueryDict
实例:
request.GET = request.GET.copy()
之后你就可以修改QueryDict
:
>>> from django.test.client import RequestFactory
>>> request = RequestFactory().get('/')
>>> request.GET
<QueryDict: {}>
>>> request.GET['foo'] = 'bar'
AttributeError: This QueryDict instance is immutable
>>> request.GET = request.GET.copy()
<QueryDict: {}>
>>> request.GET['foo'] = 'bar'
>>> request.GET
<QueryDict: {'foo': 'bar'}>
这是有意设计的,因此不允许任何应用程序组件编辑源请求数据,因此即使再次创建不可变的 QueryDict
也会破坏这种设计。我仍然建议您遵循指南并直接在中间件中的 request
对象上分配额外的请求数据,尽管这可能会导致您编辑源代码。
关于python - django 修改请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18930234/