flask 裝飾器 AssertionError: View function mapping is overwriting an existing endpoint function

tslam發表於2024-04-04

1 問題描述

寫了一個登陸認證裝飾器, 部分試圖,只有使用者登陸才能訪問

def login_wrapper(func):
    def inner(*args, **kwargs):
        """
        判斷是否登陸
        若是
            進入檢視函式
        否則
            重定向到登陸頁面
        """
        if IS_LOGIN['is_login']:
            res = func(*args, **kwargs)
            return res
        return redirect('/login')

    return inner

啟動專案後遇到如下報錯:

   AssertionError: View function mapping is overwriting an existing endpoint function: inner

2 報錯重現

原來如果把函式名寫重,就會導致出現該報錯

但是這裡檢視函式名並沒有問題,為什麼也出現了這個問題?

查資料後得知,是 裝飾器 出現了問題!

經過 裝飾器 裝飾之後的函式,它們的 __name__ 已經從原來的函式名變成 inner,也就是變成了裝飾器內部的函式名稱

我們可以透過列印函式的 __name__ 看到這一結果:

3 解決

1) 給inner._ _name_ _設定唯一值

2) 路由中給引數endpoint設定唯一值

相關文章