默认login_required,而不是到处添加装饰器



我使用Flask-HTTPAuth来处理我的应用程序中的身份验证。我有很多视图,我不想将login_required添加到其中的每一个。如何设置默认需要登录?

from flask.ext.httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
    return username == '111' and password == '222'
@app.route('/')
@app.route('/home/')
@auth.login_required
def index():
    return 'Hello'
@app.route('/route2/')
def route2():
    return 'route2'
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

你可以添加一个默认需要登录的before_request函数,并为少数不需要登录的路由创建一个简单的login_exempt装饰器。

确保免除静态文件,否则它们将无法为未经身份验证的用户加载。

Flask-HTTPAuth的login_required没有办法将require逻辑从视图装饰器中分离出来,你需要在不运行视图的情况下通过一点舞蹈来require auth。

def login_exempt(f):
    f.login_exempt = True
    return f
# a dummy callable to execute the login_required logic
login_required_dummy_view = auth.login_required(lambda: None)
@app.before_request
def default_login_required():
    # exclude 404 errors and static routes
    # uses split to handle blueprint static routes as well
    if not request.endpoint or request.endpoint.rsplit('.', 1)[-1] == 'static':
        return
     view = current_app.view_functions[request.endpoint]
     if getattr(view, 'login_exempt', False):
         return
     return login_required_dummy_view()
# for example, the login page shouldn't require login
@app.route('/login', methods=['GET', 'POST'])
@login_exempt
def login():
    pass

相关内容

  • 没有找到相关文章

最新更新