78

私はすでにdjangoプロジェクトを持っており、それらのように論理的です:

url: URL?ユーザー名=名前&pwd=パスワード

見る:

def func(request):
   dic = request.GET

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

しかし今、データを暗号化する必要があります。次に、リクエストは次のようになります。

url: URL?crypt=XXXXXXXXXX (XXXXXXXX は "username=name&pwd=passwd" の暗号化文字列)

そのため、すべてのビュー関数を変更する必要があります。しかし、今では、すべてのビュー関数を変更できないように、django ミドルウェアで復号化したいと考えています。

しかし、request.GET を変更すると、「この QueryDict インスタンスは不変です」というエラー メッセージが表示されます。どうすれば変更できますか?

4

6 に答える 6

66

不変性を取り除く:

if not request.GET._mutable:
   request.GET._mutable = True

# now you can spoil it
request.GET['pwd'] = 'iloveyou'

アップデート

Django が承認した方法は、request.GET.copy()です。

ドキュメントによると:

request.POST および request.GET の QueryDicts は、通常の要求/応答サイクルでアクセスされると不変になります。変更可能なバージョンを取得するには、QueryDict.copy() を使用する必要があります。

将来の Django バージョンが_mutableを使用することを保証するものは何もありません。これは、 copy()メソッドよりも変更される可能性が高くなります。

于 2016-07-14T10:49:39.787 に答える
3
request.GET._mutable = True

あなたはこれを必要とします。

def func(request):
   dic = request.GET
   request.GET._mutable = True #to make it editable 
   username = dic.get("username")
   request.GET.pop("pwd")
   request.GET._mutable = False #make it False once edit done
于 2019-12-13T11:33:54.900 に答える
0

現在、Django 3.2.2 を使用しています。変更する必要がありましたself.request.query_params。の単なるラッパーであるコメントをここで読みました。self.request.query_paramsself.request.GET

まず、次のことを試しました。

self.request.GET = self.request.GET.copy()
... modify self.request.GET

でもself.request.query_params変わっていません。

self.request.query_params = self.request.GETまたはを明示的に試したところself.request.query_params = self.request.query_params.copy()、 が得られAttributeError: can't set attributeました。

機能した唯一のアプローチ:

self.request.query_params._mutable = True
self.request.query_params['attribute'] = 'needed_value'
self.request.query_params._mutable = False
于 2022-02-02T15:27:06.800 に答える