2016-06-02 5 views
0

DjangoのHttpRequestオブジェクトと混同しています。 AuthenticationMiddlewareは、userrequestに追加し、これはHttpRequestのインスタンスです。そして、コードはhereですが、私が示したいことは以下の通りである:私はのHttpRequestオブジェクトのコードを読んでいると__setattr__方法を持っていないuser属性とそのコードを見つけることができませんHttpRequestインスタンスがDjangoで動的に属性を追加しますか?

request.user = SimpleLazyObject(lambda: get_user(request))

。ですから、既存の属性が存在しない場合にコードがAtrributeErrorを発生させない理由が不思議です。

助けてくれてありがとう。

+1

私はPythonが必要な場所に、プロパティ/フィールドを追加することができます、あなたがについて尋ねているのか理解していない?... – Sayse

+0

のHttpRequestがuser' 'のような属性を持っていない場合、その後、あなたが書きます'request.user'はAttributeErrorを発生させます@ Sayse –

+0

しかし、それを使用する必要があるときはいつでも、それはauthミドルウェアに追加されているので属性を持ちます。このミドルウェアが実行される前に、自分のミドルウェア*で使用しようとしていますか? – Sayse

答えて

3

HttpRequestは、objectから継承するクラスです。 Pythonでは、いつでもオブジェクトの属性を設定できます。

HttpRequestは、通常の状態ではユーザーに関するデータを含まないHTTP要求を記述します。そのため、AuthenticationMiddlewareuserを要求に追加します。


__setitem__オブジェクトに索引付けされた項目を設定するための方法です。

__setattr__は、オブジェクトに属性を設定する方法であり、objectに実装されているメソッドの1つです。


UPDATE
@sayseは、それがなっている言ったように。

>>> class Test(object): 
    pass 

>>> test = Test() 
>>> test.user #Try to access an unset attribute 
Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    test.user #Try to access an unset attribute 
AttributeError: 'Test' object has no attribute 'user' 
>>> test.user = 'user' #Set user attribute 
>>> test.user #Try to access user 
'user' 
+0

"Pythonの属性はいつでもオブジェクトに設定できます。" 'class Test(object):pass'、' t = Test() 'の場合、' t.user'はAttributeErrorを送出します。 –

+0

@chyooCHENG - それは取得していて、設定していません。 (うまく書かれたbtw、James Fenwick) – Sayse

+0

私はそれを理解しました。皆さんありがとう! –

関連する問題