Python 不同设计图的不同登录视图
我有一个flask web应用程序,它有多个蓝图: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最重要的特性之一是无状态性,这意味着服务器不会“记住”来自客户端的任何信息
- restserver
- 网络服务器
@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',
}