flask第三方登陆插件flask_login用法详解

flask_login模块主要是用来验证登陆的插件,使用起来肯定比自己写要方便得多

Flask-Login 通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user)
login_user() 函数:实现用户的登入,一般在登入的视图函数中调用
logout_user() 函数:实现登出功能
current_user 属性:获取当前用户
对于使用者来说,如果需要页面是授权用户才可见,在相应视图函数前加上 @login_required 装饰器进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到 LoginManager.login_view 所指定的视图

下面我们来看看flask_login的具体用法

首先安装模块

01.
pip install flask_login

然后需要我们去应用工厂注册注册该模块和app绑定,还是把我项目的工厂函数发上来

01.
#!/usr/bin/python3
02.
#coding:utf-8
03.
from flask import Flask
04.
from app.web import web
05.
from config import load_json
06.
from .common import db,mail
07.
from flask_login import LoginManager
08.
import logging
09.
import os
10.
import time
11.
config = load_json()
12.
loginmanager=LoginManager()
13.
loginmanager.login_view='web.login' #没有登录直接跳转的地址
14.
loginmanager.session_protection='strong'
15.
loginmanager.login_message='please login !'
16.
17.
def create_app():
18.
    app = Flask(__name__)
19.
    app.secret_key = 'sulao'
20.
    configure_db(app)
21.
    db.init_app(app)
22.
    register_blueprint(app)
23.
    configure_mail(app)
24.
    mail.init_app(app)
25.
    configure_logger(app)
26.
    loginmanager.init_app(app)
27.
    return app
28.
29.
def configure_db(app):
30.
    #查询时会显示原始SQL语句
31.
    app.config['SQLALCHEMY_ECHO'] = True
32.
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
33.
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}?charset=utf8mb4'.format(
34.
        db_user=config['db']['db_user'],
35.
        db_pass=config['db']['db_pass'],
36.
        db_host=config['db']['db_host'],
37.
        db_port=config['db']['db_port'],
38.
        db_name=config['db']['db_name'])
39.
40.
def configure_mail(app):
41.
    app.config['MAIL_SERVER'] = config['mail']['mail_host']
42.
    app.config["MAIL_PORT"] = config['mail']['mail_port']
43.
    app.config["MAIL_USE_SSL"] = True
44.
    app.config["MAIL_USERNAME"] = config['mail']['mail_user']
45.
    app.config["MAIL_PASSWORD"] = config['mail']['mail_pass']
46.
47.
def configure_logger(app):
48.
    log_dir_name = "logs"
49.
    log_file_name = 'logger-' + time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.log'
50.
    log_file_str = log_dir_name + os.sep + log_file_name
51.
    log_level = logging.WARNING
52.
    handler = logging.FileHandler(log_file_str, encoding='UTF-8')
53.
    handler.setLevel(log_level)
54.
    logging_format = logging.Formatter(
55.
        '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
56.
    handler.setFormatter(logging_format)
57.
    app.logger.addHandler(handler)
58.
59.
def register_blueprint(app):
60.
    app.register_blueprint(web, url_prefix='')

然后还需要对模型进行修改,我的模型如下

01.
#!/usr/bin/python3
02.
#coding:utf-8
03.
from datetime import datetime
04.
from app.common import db
05.
from flask_login import AnonymousUserMixin
06.
07.
class Category(db.Model):
08.
    __tablename__ = "category"
09.
    cateid = db.Column(db.Integer, primary_key=True, autoincrement=True)
10.
    catname = db.Column(db.String(255))
11.
    thumb = db.Column(db.String(255))
12.
    listorder = db.Column(db.Integer)
13.
    aliasname = db.Column(db.String(255))
14.
    ismenu = db.Column(db.Integer, default=1)
15.
    rootid = db.Column(db.Integer, default=0)
16.
    parentid = db.Column(db.Integer, default=0)
17.
    __mapper_args__ = {
18.
        "order_by": cateid.desc()
19.
    }
20.
21.
class Post(db.Model):
22.
    __tablename__ = 'post'
23.
    postid = db.Column(db.Integer, primary_key=True, autoincrement=True)
24.
    cateid = db.Column(db.Integer)
25.
    userid = db.Column(db.Integer)
26.
    tag = db.Column(db.String(255))
27.
    thumb = db.Column(db.String(255))
28.
    status = db.Column(db.Integer, default=1)
29.
    aliasname = db.Column(db.String(255))
30.
    istop = db.Column(db.Integer)
31.
    title = db.Column(db.String(255))
32.
    intro = db.Column(db.Text(65536))
33.
    content = db.Column(db.Text(16777216))
34.
    posttime = db.Column(db.DateTime, default=datetime.utcnow)
35.
    updatetime = db.Column(db.DateTime, default=datetime.utcnow)
36.
    __mapper_args__ = {
37.
        "order_by": postid.desc()
38.
    }
39.
40.
class Tag(db.Model):
41.
    __tablename__ = 'tag'
42.
    tagid = db.Column(db.Integer, primary_key=True, autoincrement=True)
43.
    tagname = db.Column(db.String(32))
44.
    letter = db.Column(db.String(64))
45.
    postid = db.Column(db.Integer)
46.
    __mapper_args__ = {
47.
        "order_by": tagid.desc()
48.
    }
49.
50.
class Comment(db.Model):
51.
    __tablename__ = 'comment'
52.
    commentid = db.Column(db.Integer, primary_key=True, autoincrement=True)
53.
    postid = db.Column(db.Integer)
54.
    status = db.Column(db.Integer, default=0)
55.
    title = db.Column(db.String(32))
56.
    email = db.Column(db.String(128))
57.
    content = db.Column(db.String(255))
58.
    posttime = db.Column(db.DateTime, default=datetime.utcnow)
59.
    ipaddress = db.Column(db.String(16))
60.
    useragent = db.Column(db.String(255))
61.
    __mapper_args__ = {
62.
        "order_by": commentid.desc()
63.
    }
64.
65.
class User(db.Model):
66.
    __tablename__ = 'user'
67.
    userid = db.Column(db.Integer, primary_key=True, autoincrement=True)
68.
    level = db.Column(db.Integer)
69.
    status = db.Column(db.Integer, default=1)
70.
    name = db.Column(db.String(32))
71.
    nick = db.Column(db.String(32))
72.
    password = db.Column(db.String(32))
73.
    email = db.Column(db.String(128))
74.
    ipaddress = db.Column(db.String(16))
75.
    posttime = db.Column(db.DateTime, default=datetime.utcnow)
76.
    __mapper_args__ = {
77.
        "order_by": userid.desc()
78.
    }
79.
    def is_authenticated(self):
80.
        if isinstance(self,AnonymousUserMixin):
81.
            return False
82.
        else:
83.
            return True
84.
    def is_active(self):
85.
        return True
86.
    def is_anonymous(self):
87.
        if isinstance(self,AnonymousUserMixin):
88.
            return True
89.
        else:
90.
            return False
91.
    def get_id(self):
92.
        return unicode(self.id)
93.
94.
class Upload(db.Model):
95.
    __tablename__ = 'upload'
96.
    attchmentid = db.Column(db.Integer, primary_key=True, autoincrement=True)
97.
    userid = db.Column(db.Integer)
98.
    size = db.Column(db.Integer)
99.
    filepath = db.Column(db.String(255))
100.
    alt = db.Column(db.String(255))
101.
    mimetype = db.Column(db.String(255))
102.
    posttime = db.Column(db.DateTime, default=datetime.utcnow)
103.
    __mapper_args__ = {
104.
        "order_by": attchmentid.desc()
105.
    }
106.
107.
class Setting(db.Model):
108.
    __tablename__ = 'setting'
109.
    systemid = db.Column(db.Integer, primary_key=True)
110.
    name = db.Column(db.String(32))
111.
    configure = db.Column(db.Text(65536)

以上添加的类的方法介绍

01.
is_authenticated:表示user对象是否登录
02.
is_active:表示用户是否激活,如:激活状态和未激活状态采用不同的处理
03.
is_anonymous:表示访问者是否处于未登录的匿名状态
04.
get_id:返回user对象的唯一识别标志

然后是视图函数的使用方法

首先需要在login函数中注册

01.
from flask_login import login_user,login_required,logout_user,current_user
02.
@web.route('/login/', methods=['POST', 'GET'])
03.
def login():
04.
    form = LoginForm(request.form)
05.
    if request.method == "POST" and form.validate():
06.
        username = request.form.get('username')
07.
        password = request.form.get('password')
08.
        user = db.session.query(User).filter_by(username == username).first()
09.
        if user:
10.
            # 将用户信息注册到flask-login中
11.
            login_user(user)
12.
         next = request.args.get('next')
13.
            if user.check_password(password):
14.
                return redirect(url_for('web.member'))
15.
            else:
16.
                pass_err = "密码不正确"
17.
                return render_template('mylogin.html', pass_err=pass_err, form=form)
18.
        else:
19.
            name_err = "用户名不正确"
20.
            return render_template('mylogin.html', name_err=name_err, form=form)
21.
    return render_template('account.html', form=form)
22.
    
23.
@web.route('/logout/')
24.
@login_required# 装饰器,必须登录才能有权限 ****
25.
def logout():
26.
    logout_user()
27.
    return redirect(url_for('web.login'))

前端示例

01.
<--> 用户如果登录则显示用户名,否则给出登录和注册的链接 </--> 
02.
{% if current_user.is_authenticated %}
03.
   <li class="layui-nav-item">
04.
       <a href="javascript:;">
05.
           {{ current_user.username }}
06.
       </a>
07.
   <dl class="layui-nav-child">
08.
       <dd><a href="" target="page_content">基本资料</a></dd>
09.
       <dd><a href="">安全设置</a></dd>
10.
   </dl>
11.
   </li>
12.
   <li class="layui-nav-item"><a href="{{ url_for("cms.logout") }}">退了</a></li>
13.
 {% else %}
14.
   <li class="layui-nav-item"><a href="{{ url_for("cms.login") }}">登录</a></li>
15.
   <li class="layui-nav-item"><a href="{{ url_for("cms.register") }}">注册</a></li>
16.
 {% endif %}


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/669

评论列表

0%