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
View Code

 

在视图函数中使用 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')
View Code

 

 

 

知识补充:  current_app中给存入一些内容,以便于在全局(视图函数中)中调用放进去的内容

 

 

 

posted on 2018-05-31 16:03  王大拿  阅读(587)  评论(0)    收藏  举报

导航