2016-12-29 9 views
2

を得た:デコレータは()私は、Djangoのビューでこのエラーを持って予想外のキーワード引数

TypeError at /web/host/1/ 
decorator() got an unexpected keyword argument 'host_id' 
Request Method: GET 
Request URL: http://127.0.0.1:8000/web/host/1/edit 
Django Version: 1.10.4 
Exception Type: TypeError 
Exception Value:  
decorator() got an unexpected keyword argument 'host_id' 

とurlpatternsは以下のとおりです。

url(r'^host/(?P<host_id>[0-9]+)$', host, name='host'), 

ビュー機能は次のとおりです。

@check_login 
def host(request, host_id, *args, **kwargs): 
    h = Host() 
    # resultHost = h.get_host(host_id) 
    return render(request, 'web/host.html') 

以下のcheck_login:

def check_login(f): 
    """verify if user login""" 
    def decorator(request): 
     if request.session.get('user', None): 
      return f(request) 
     else: 
      return HttpResponseRedirect(reverse("web:login")) 
    return decorator 

パラメータ「host_id」を指定せずにurlを使用し、host_idを指定しないでhost関数を使用すると、プログラムは完璧に動作します。

何が問題なのですか?ありがとうございました。

+0

私は問題がデコレータ 'check_login'をどのように定義したのかと思いますデコレータコールに渡される 'host_id'の値を考慮していないことを示します。あなたの質問に 'check_login'コードを追加できますか? –

+0

これを追加します。 –

+0

@check_loginをhost()の上に置くと、問題は残っています。 –

答えて

4

問題はcheck_loginデコレータコードにあります。具体的な問題はここにある:

def check_login(f): 
    """verify if user login""" 
    def decorator(request): # <-- Only allows for a keyword value of 'request' 
     if request.session.get('user', None): 
      return f(request) 
     else: 
      return HttpResponseRedirect(reverse("web:login")) 
    return decorator 

あなたが呼び出さデコレータに渡されるかもしれない余分なキーワード引数を受け入れる必要がある問題を解決するには。効果的に「余分なキーワード引数をとり、それらを単一の値として表現する」という可変引数を使用すると、これを行うことができます。規約上、この単一の値(以下の例では**kwargs)は、キーが引数の名前であり、値が引数の値である辞書です。 kwargsという名前は、可変引数にPythonでよく使われる規則ですが、必須ではありません。有効な変数名を使用できます。

def check_login(f): 
    """verify if user login""" 
    def decorator(request, **kwargs): # <-- **kwargs will absorb any additional keyword arguments that are passed during invocation 
     if request.session.get('user', None): 
      return f(request, **kwargs) 
     else: 
      return HttpResponseRedirect(reverse("web:login")) 
    return decorator 

それともそれがさらに一般的あなたがそうのように両方の可変引数位置キーワード引数受け入れることができようにする:私は「より*argsの使用に関する情報と**kwargsについては

def check_login(f): 
    """verify if user login""" 
    def decorator(request, *args, **kwargs): # <-- *args will absorb any additional positional arguments 
               # <-- **kwargs will absorb any additional keyword arguments 
     if request.session.get('user', None): 
      return f(request, *args, **kwargs) 
     else: 
      return HttpResponseRedirect(reverse("web:login")) 
    return decorator 

をdここでチュートリアルをチェックすることをお勧めします:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

+0

ありがとうございました!問題は解決しました。 –

+0

@张利高 - 問題ありません!私は間違いを覚えましたが、可変引数を装飾された関数 'f()'に渡すのを忘れてしまいました。私はその問題を解決するために私の答えを更新しました。 –

関連する問題