python - django 修改请求对象

标签 python django

我已经有一个 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.GETrequest.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/

相关文章:

python - 如何检查元素的值或其值邻居(在设定范围内)是否存在列表

python - 为什么 scapy 在 Mac 上安装失败?

Python Pandas 计算不包括当前组的标准偏差,带有矢量化解决方案

javascript - Django 、jQuery。我无法在同一个 div 后多次加载()

python - Django/html 表 : Description inside header row shifts to the right

python - 引号中的 mypy 显式类型提示仍然给出未定义的错误

python - 为 Django.db 连接对象指定只读访问

python - 重置密码后的 Django 身份验证问题

python - 在 Django 中连接字符串时如何换行

python - flatMap 还是在 Python 3 中绑定(bind)?