flask current_app 和app的关系 和用户登录验证
知识补充 app 和应用上下文中的 current_app的关系

在flask的init中对做 用户登录验证功能,low的方法

方式三:把功能封装到一个类中,使用的时候就调用这个功能就可以了

代码 自定义好了登录验证功能
auth.py
from flask import request,session,redirect class Auth(object): def __init__(self,app=None): self.app = app if app: self.init_app(app) def init_app(self,app): #给app中传入一个参数 auth_manager,这个参数对应的就是用户验证的这个对象, #然后再视图函数中就可用通过 curren_app.auth_manager.login(user)来调用 # 当前实例化的 Auth对象的 login方法来写入session信息 app.auth_manager = self self.app = app app.before_request(self.check_login) #通过此方法注册内筒,然后就可以直接导入这个函数中的返回值 app.context_processor(self.context_processor) def check_login(self): """ 检查用户是否已经登录 :return: """ if request.path == '/login': return user = session.get('user') if not user: return redirect('/login') def context_processor(self): user = session.get('user') #返回的是一个字典 就可以在 html中来导入这个内 显示当前登录的用户 {{current_user}}
return dict(current_user=user) def login(self,data): """ 将用户登录信息,放入session :param data: :return: """ session['user'] = data def logout(self): """ 将用户登录信息,放入session :param data: :return: """ del session['user']
__init__.py 中引入并实例化 初始化了auth对象 并且可以实现用户访问的 befor_request中进行用户登录验证
from flask import Flask from flask_sqlalchemy import SQLAlchemy from exts.auth import Auth # 包含了SQLAlchemy相关的所有操作 db = SQLAlchemy() #引入蓝图的位置一定要后于 db 应为程序是顺序执行的,在蓝图中会用到 #db这个对象 所以要放在他的下边引入 from .views.account import ac from .views.home import hm def create_app(): app = Flask(__name__) app.config.from_object('settings.DevelopmentConfig') app.register_blueprint(ac) app.register_blueprint(hm) #初始化db这个对象,传入当前app中的配置,然后初始化会用到他的关于数据库的一些配置内容 db.init_app(app) #可以这样写 # Auth(app) #也可以这样,将 auth=Auth() #将app穿件去,用于实例化 auth.init_app(app) return app
在视图函数中使用 Auth对象中封装的用户退出和
account.py
from flask import blueprints,render_template,request,session,redirect,current_app from s8day130_pro import models from s8day130_pro import db ac = blueprints.Blueprint('ac',__name__) @ac.route('/login',methods=['GET','POST']) def login(): if request.method == 'GET': return render_template('login.html') else: user = request.form.get('user') pwd = request.form.get('pwd') obj = db.session.query(models.Users).filter(models.Users.name==user,models.Users.pwd==pwd).first() db.session.remove() if not obj: return render_template('login.html',msg='用户名或密码错误') #因为在auth.py中 给current_app传入的 author_manager这个对象 #所以在视图函数中就可以通过 current_app来调用这个对象的方法 current_app.auth_manager.login(user) return redirect('/index') @ac.route('/logout') def logout(): # #因为在auth.py中 给current_app传入的 author_manager这个对象 #所以在视图函数中就可以通过 current_app来调用这个对象的方法 current_app.auth_manager.logout() return redirect('/login')
知识补充: current_app中给存入一些内容,以便于在全局(视图函数中)中调用放进去的内容




浙公网安备 33010602011771号