Python 不同设计图的不同登录视图

Python 不同设计图的不同登录视图,python,flask,flask-login,Python,Flask,Flask Login,我有一个flask web应用程序,它有多个蓝图: restserver 网络服务器 webserver和restserver中的大多数端点都要求用户登录。我使用flask登录扩展,它提供了所需的@login\u装饰器 对于不同的蓝图,是否可以有不同的登录视图 # for web blueprint login_mananger.login_view = '/web/login' .. so on RESTful最重要的特性之一是无状态性,这意味着服务器不会“记住”来自客户端的任何信息

我有一个flask web应用程序,它有多个蓝图:

  • restserver
  • 网络服务器
webserver和restserver中的大多数端点都要求用户登录。我使用flask登录扩展,它提供了所需的
@login\u
装饰器

对于不同的蓝图,是否可以有不同的
登录视图

# for web blueprint
login_mananger.login_view = '/web/login'

 .. so on

RESTful最重要的特性之一是无状态性,这意味着服务器不会“记住”来自客户端的任何信息,来自客户端的请求应该包含所有需要的信息,包括身份验证信息

回到您的问题,您不必使用Flask登录进行RESTful服务身份验证,而且由于客户端的多样性,您不应该使用cookie或会话。当然,您可以DIY HTTP身份验证,但这正是您真正需要的

以下是烧瓶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)
@app.route('/private')
@auth.login_required
def private_page():
    return "Only for authorized people!" 
根据Flask 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)
@app.route('/private')
@auth.login_required
def private_page():
    return "Only for authorized people!" 
回调函数有两个参数,用户名和 密码,并且必须返回True或False

您应该注意,Flask HTTPAuth的初始化仅在蓝图中,而不是整个应用程序中,因为此身份验证仅在restserver蓝图中使用。

然后有一个类似于Flask login的@login_required的函数,由Flask 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)
@app.route('/private')
@auth.login_required
def private_page():
    return "Only for authorized people!" 
当身份验证成功时,将调用此“login_required”回调函数。由于restserver的所有路由都应该受到保护,因此可以使用“before_request”处理程序将保护应用于整个蓝图。假设您的restserver blueprint的名称为“rest”,并且您已将用户对象保存在“g”中,就像我们之前所做的那样:

from flask import jsonify

@rest.before_request 
@auth.login_required 
def before_request(): 
    if not g.current_user:
        return jsonify({'error':'Unauthorized.'})
我想这就行了。我上面写的只是最简单的示例,您可以在许多方面做得更好,比如在第一次请求后用令牌替换用户凭据。我相信你会明白的


如果我的回答有帮助的话,如果你能对这个答案投“赞成票”,那将是我的荣幸,谢谢。

RESTful最重要的特性之一是无状态,这意味着服务器不会“记住”来自客户端的任何信息,来自客户端的请求应该包含所有需要的信息,包括身份验证信息

回到您的问题,您不必使用Flask登录进行RESTful服务身份验证,而且由于客户端的多样性,您不应该使用cookie或会话。当然,您可以DIY HTTP身份验证,但这正是您真正需要的

以下是烧瓶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)
@app.route('/private')
@auth.login_required
def private_page():
    return "Only for authorized people!" 
根据Flask 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)
@app.route('/private')
@auth.login_required
def private_page():
    return "Only for authorized people!" 
回调函数有两个参数,用户名和 密码,并且必须返回True或False

您应该注意,Flask HTTPAuth的初始化仅在蓝图中,而不是整个应用程序中,因为此身份验证仅在restserver蓝图中使用。

然后有一个类似于Flask login的@login_required的函数,由Flask 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)
@app.route('/private')
@auth.login_required
def private_page():
    return "Only for authorized people!" 
当身份验证成功时,将调用此“login_required”回调函数。由于restserver的所有路由都应该受到保护,因此可以使用“before_request”处理程序将保护应用于整个蓝图。假设您的restserver blueprint的名称为“rest”,并且您已将用户对象保存在“g”中,就像我们之前所做的那样:

from flask import jsonify

@rest.before_request 
@auth.login_required 
def before_request(): 
    if not g.current_user:
        return jsonify({'error':'Unauthorized.'})
我想这就行了。我上面写的只是最简单的示例,您可以在许多方面做得更好,比如在第一次请求后用令牌替换用户凭据。我相信你会明白的


如果我的回答有帮助,我将非常荣幸您能对此回答进行“投票”,谢谢。

在您的情况下,您需要将登录管理器声明与flask应用程序实例放在同一个文件中。这通常是一个
\uuuuu init\uuuuuuuuuuuupy.py
文件,带有
app=Flask(\uuuuuu name\uuuuuuuuuu)。
在顶部,导入LoginManager类

from flask_login import LoginManager
然后将其绑定到应用程序实例

login_manager = LoginManager()
login_manager.init_app(app)
(这不是问题,只是以防万一有人需要它)假设您有管理员和普通用户,并且您正在从不同的表进行身份验证:

@login_manager.user_loader
def load_user(user_id):
    x = Users.query.get(str(user_id))
    if x == None:
        x = Admins.query.get(str(user_id))
    return x
最后,在导入蓝图之后,您可以在字典中为每个蓝图定义登录视图

login_manager.blueprint_login_views = {
    'admin': '/admin/login',
    'site': '/login',
}

在您的情况下,您需要将登录管理器声明与flask应用程序实例放在同一个文件中。这通常是一个
\uuuuu init\uuuuuuuuuuuupy.py
文件,带有
app=Flask(\uuuuuu name\uuuuuuuuuu)。
在顶部,导入LoginManager类

from flask_login import LoginManager
然后将其绑定到应用程序实例

login_manager = LoginManager()
login_manager.init_app(app)
(这不是问题,只是以防万一有人需要它)假设您有管理员和普通用户,并且您正在从不同的表进行身份验证:

@login_manager.user_loader
def load_user(user_id):
    x = Users.query.get(str(user_id))
    if x == None:
        x = Admins.query.get(str(user_id))
    return x
最后,在导入蓝图之后,您可以在字典中为每个蓝图定义登录视图

login_manager.blueprint_login_views = {
    'admin': '/admin/login',
    'site': '/login',
}