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

标签 python flask flask-httpauth

我在我的应用程序中使用 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 逻辑与 View 装饰器分开,您需要在不运行 View 的情况下通过一些小 Action 来要求 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

关于python - 默认 login_required 而不是到处添加装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761002/

相关文章:

当正则表达式工具指示它应该时,python 正则表达式不匹配

flask - 如何使用 SQLalchemy 和 Alembic 自动初始化数据库?

python - Flask-Babel 的 Flask 测试设置

python - 在不同的文件中分组写入行

python - Pandas 分组和过滤器

python - 在python中寻找文件的中间

python - 使用Flask-Mail通过Gmail发送Email-socket.gaierr

python-3.x - 从 Flask_httpauth 导入 HTTPTokenAuth 时遇到问题

Python/Flask - 将flask_reSTLess 与flask_httpauth 结合使用

python - 我正在重组我的 Flask-restful 应用程序,但在放置 HTTP 身份验证以使应用程序运行时遇到问题