簡體   English   中英

decorator()收到了意外的關鍵字參數

[英]decorator() got an unexpected keyword argument

我在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的主機函數,則程序將運行完美。

所以有什么問題? 謝謝。

問題出在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

為了使它更加籠統,您可以接受可變參數的位置參數和關鍵字參數,如下所示:

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

有關使用*args**kwargs更多信息,我建議您在此處查看該教程: https : //pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM