2013-09-21 9 views
31

を変更:ジャンゴ私はすでにDjangoのプロジェクトを持っているような、それは論理的なリクエストオブジェクト

URL:?URL、ユーザ名=名& PWD = passwdの

ビュー:

def func(request): 
    dic = request.GET 

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

が、今データを暗号化する必要があります。その後、要求はこれをなる:

URL:?URLクリプト=

ので、私はすべてのビュー機能を変更する必要があるXXXXXXXXXX( "& = PWD passwdのユーザ名=名前" のXXXXXXXXが暗号化されている文字列)。しかし今、私はdjangoミドルウェアを解読して、すべてのビュー関数を変更しないようにしたい。

しかし、私はrequest.GETを変更すると、私はエラーメッセージ "このQueryDictインスタンスは不変です"を思い出します。どうすれば修正できますか?

+8

は非常に悪い考えです。 –

+0

URL自体にユーザー名とパスワードを送信する必要があるのはなぜですか? –

+1

[djangoの可能な複製 - なぜ要求です.POSTオブジェクトは不変ですか?](http://stackoverflow.com/questions/12611345/django-why-is-the-request-post-object-immutable) –

答えて

2

GETを使用してユーザー名とパスワードを送信しないでください。URLバーの情報が表示され、security riskと表示される可能性があります。代わりに、POSTを使用します。また、私はあなたのユーザーを認証しようとしていると思います。完全に組み込まれたものに対処するには、あまりにも多くの作業(新しいミドルウェアを作成する)のように思えます。from the docs

from django.contrib.auth import authenticate, login 

def my_view(request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      # Redirect to a success page. 
     else: 
      # Return a 'disabled account' error message 
    else: 
     # Return an 'invalid login' error message. 

私自身は実際にlogin_required decoratorを使用して、非常に使いやすいのが好きです。希望するのは

+0

ありがとう回答。これは単なる例です。 GETだけでなく、POSTも使用します。ポストを使用してもデータを暗号化する必要があります。私は 'tcpdump'クロールパケットのようなツールを恐れているので、暗号化/復号化が必要です。私を混乱させる質問は、できるだけ少ないビュー機能を変更する方法です。だから私はミドルウェアを使用したい – user2801567

+0

独自のミドルウェアの作成についてのドキュメントを見てください。 process_requestまたはprocess_viewを使用したいが、要求にアクセスすることに注意する。それらの中のPOSTはビューを実行させません(csrfはそのルールの例外ですので、独自の方法を理解する方法を見てください)https://docs.djangoproject.com/en/dev/topics/http/middleware/ – yuvi

+0

また、関連性はどれくらいか分かりませんが、これを見てください:https://pypi.python.org/pypi/django-secure – yuvi

54

django.http.QueryDictrequest.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オブジェクトで、ガイドラインに沿って追加のリクエストデータを直接割り当てることをお勧めします。ソースを編集する可能性があります。

24

不変性を削除:URLにユーザー名とパスワードを送信

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

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

これは良いPOSTリクエストでcopy()に関連するコストを避けるために... –

+9

...内部属性を変更するため、悪化します。 –

+2

あなたの値を設定した後、 'request.GET._mutable = False'を実行するだけで、再度変更不可能にすることができます。 – Caumons

関連する問題