flask自定义组件

在使用flask-session,flask-sqlalchemy等组件时,我们发现都是导入以后实例化一个类,并将app传入进行使用,或者先实例化一个对象,再利用对象的init_app方法将app传入使用

我们也可以模仿这些组件的做法自定义一个认证组件

首先创建组件的目录和文件

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 = 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')
        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']

这里要注意app.context_processor方法可以定义一些全局的变量,在所有的视图中都可以渲染使用

同时为了在视图中能使用这个类中的函数,我们在init_app方法中定义了app.auth_manager = self,这样在视图中我们就可以通过导入current_app.auth_manager来得到这个类的对象,从而调用类中的方法了

视图中应用

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='用户名或密码错误')

        current_app.auth_manager.login(user)
        return redirect('/index')


@ac.route('/logout')
def logout():
    current_app.auth_manager.logout()
    return redirect('/login')

__init__.py中使用自定义组件

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from exts.auth import Auth

# 包含了SQLAlchemy相关的所有操作
db = SQLAlchemy()

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.init_app(app)
    Auth(app)

    return app

 

转载于:https://www.cnblogs.com/weiwu1578/articles/8992260.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值