django修改请求对象 [英] django modifying the request object

查看:927
本文介绍了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是加密的str为username = name& pwd = passwd)



所以我需要修改每个视图功能。但是现在我想在django中间件中解密以防止修改每个视图功能。



但是当我修改request.GET时,我收到错误msg这个QueryDict实例是不可变的 。如何修改?

解决方案

django.http.QueryDict 分配给 request.GET request.POST 是不可变的。



您可以将其转换为一个可变的 QueryDict 实例通过复制它:

  request.GET =请求.GET.copy()

之后,您将可以修改 QueryDict

 >>> from django.test.client import RequestFactory 
>>> request = RequestFactory()。get('/')
>>> request.GET
< QueryDict:{}>
>>> request.GET ['foo'] ='bar'
AttributeError:此QueryDict实例是不可变的
>>> request.GET = request.GET.copy()
< QueryDict:{}>
>>> request.GET ['foo'] ='bar'
>>> request.GET
< QueryDict:{'foo':'bar'}>

这是有目的的设计,以便不允许任何应用程序组件编辑源请求数据,所以即使创建一个不可变的 QueryDict 也会破坏这个设计。我仍然建议您遵循指南,并直接在中间件的请求对象上分配其他请求数据,尽管这可能会导致您编辑源。 / p>

I already have a django project and it logical like those:

url: URL?username=name&pwd=passwd

view:

def func(request):
   dic = request.GET

   username = dic.get("username")
   pwd = dic.get("pwd")

but now we need encrypt the data. Then, the request become this:

url: URL?crypt=XXXXXXXXXX (XXXXXXXX is encrypted str for "username=name&pwd=passwd")

so I need modify every view function. But now I want decrypt in django middleware to prevent from modifying every view function.

but when I modify request.GET, I recive error msg "This QueryDict instance is immutable". How can I modify it?

解决方案

django.http.QueryDict objects that are assigned to request.GET and request.POST are immutable.

You can convert it to a mutable QueryDict instance by copying it:

request.GET = request.GET.copy()

Afterwards you'll be able to modify the 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'}>

This has been purposefully designed so that none of the application components are allowed to edit the source request data, so even creating a immutable QueryDict again would break this design. I would still suggest that you follow the guidelines and assign additional request data directly on the request object in your middleware, despite the fact that it might cause you to edit your sources.

这篇关于django修改请求对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆