1. 程式人生 > >flask-login中的login_required裝飾器

flask-login中的login_required裝飾器

flask-login模組中login_required裝飾器
先看看原始碼

def login_required(func):

    @wraps(func)

    def decorated_view(*args, **kwargs):

        if request.method in EXEMPT_METHODS:

            return func(*args, **kwargs)

        elif current_app.login_manager._login_disabled:

            return func(*args, **kwargs)

        elif not current_user.is_authenticated:

            return current_app.login_manager.unauthorized()

        return func(*args, **kwargs)

    return decorated_view

EXEMPT_METHODS引數為EXEMPT_METHODS = set(['OPTIONS']),
current_app.login_manager._login_disabled 預設是False,在login_manager.py第119行,
self._login_disabled = app.config.get('LOGIN_DISABLED', False),如果沒有設定的話,預設是False,
一般會進行到第三句判斷,current_user.is_authenticated,判斷當前使用者是否認證,如果沒有認證的話就執行unauthorized(),
unauthorized()會重定向到login_view引數設定的路由函式中去,所以在例項化LoginManager後要設定login_view屬性,
當用戶沒有登陸時,會自動重定向到登陸介面,沒有設定會返回401錯誤, 使用者登陸後,這個裝飾器就直接返回func(*args, **kwargs),相當於沒有包裝一樣,裝飾器起到包裝介面的作用。