我有一个烧瓶web应用程序,它有多个蓝图(restserver,webserver)。不同烧瓶蓝图的Differnet登录视图
webserver和restserver中的大多数端点都需要用户登录。我使用flask-login扩展,它提供了@login_required
装饰器。
是否有可能有不同的蓝图
# for web blueprint
login_mananger.login_view = '/web/login'
.. so on
我有一个烧瓶web应用程序,它有多个蓝图(restserver,webserver)。不同烧瓶蓝图的Differnet登录视图
webserver和restserver中的大多数端点都需要用户登录。我使用flask-login扩展,它提供了@login_required
装饰器。
是否有可能有不同的蓝图
# for web blueprint
login_mananger.login_view = '/web/login'
.. so on
一个REST风格的最重要的特色是无国籍,这意味着服务器将不会“记住”从客户的任何信息,从不同的请求login_view
客户应该已经包含了所有需要的信息,包括认证信息。
回到您的问题,您不必使用Flask-Login进行REST式服务验证,并且由于客户端的多样性,您不应使用Cookie或会话。你当然可以自己DIY HTTP认证,但Flask-HTTPAuth是你真正需要的。
这里是瓶,HTTPAuth的一个最简单的例子:
from flask.ext.httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
user = User.query.filter_by(username=username).first()
if not user:
return False
g.current_user = user
# You should accomplish the verify_password function by yourself in the User model.
return user.verify_password(password)
据烧瓶HTTPAuth商务部:
回调函数有两个参数,用户名和 密码必须返回True或False。
你应该注意到的初始化烧瓶HTTPAuth只是在蓝图,而不是因为这个认证只是在你的restserver蓝图使用的整个应用程序。
还有就像一个函数瓶登录的@login_required它通过烧瓶HTTPAuth提供:
@app.route('/private')
@auth.login_required
def private_page():
return "Only for authorized people!"
当认证成功的这种“login_required”回调函数将被调用。由于所有restserver的路由都应该受到保护,因此可以使用“before_request”处理程序将保护应用于整个蓝图。假设你restserver蓝图的名字是“休息”,并已保存在“G”的用户对象,就像我们做什么之前:
from flask import jsonify
@rest.before_request
@auth.login_required
def before_request():
if not g.current_user:
return jsonify({'error':'Unauthorized.'})
我认为这会做的伎俩。我上面写的只是最简单的例子,你可以用很多方式做得更好,比如在首次请求后用令牌替换用户凭证。我相信你会弄明白的。
如果我的回答很有帮助,如果您可以为此答案“upvote”,我将非常荣幸,谢谢。
也许,但是重定向到休息终端的登录视图没有任何意义。如果用户未通过身份验证,则只会返回403。 – davidism
是的。这正是我想要的。我如何确保仅为web服务器蓝图执行login_manager.login_view ='/ web/login'。 – user462455