flask-session 蓝图使用

时间:2019-08-14 23:33:07   收藏:0   阅读:15
flask_session

安装 pip install flask-session flask-session flask快速上手, 以下只介绍蓝图跟session使用,其它方法需要另行查看哈。

1、直接使用redis

from flask import Flask
from redis import Redis
from flask_session import RedisSessionInterface
from t1.views import login

app = Flask(__name__)
conn = Redis(host=‘127.0.0.1‘, port=6379, password=‘test‘)
# 重写 session_interface 方法
app.session_interface = RedisSessionInterface(conn, key_prefix=‘flask_session_‘)

2、蓝图调用

技术图片

app下的__init__.py


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#

import pymysql
from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from flask_session import Session

# 初始化连接
db = SQLAlchemy()
# 初始化session
sess = Session()

login_manager = LoginManager()
login_manager.session_protection = ‘strong‘
login_manager.login_view = ‘auther.login‘

def create_app():
    app = Flask(__name__)

    app.config.from_pyfile(‘config.py‘)

    # 初始化数据
    db.init_app(app)
    # 初始化登陆login
    login_manager.init_app(app)
    # 初始化session
    sess.init_app(app)

‘‘‘ 在蓝图中使用,不能直接使用session实例
Note You can not use Session instance directly, what Session does is just change the session_interface attribute on your Flask applications.
注意   您不能直接使用Session实例,Session所做的只是更改Flask应用程序上的session_interface属性。  ‘‘‘

      #sqlalchemy连接pymysql需要  install
    pymysql.install_as_MySQLdb()

    # 导入认证
    from app.authentication import auther

    # 注册认证蓝图
    app.register_blueprint(auther, url_prefix=‘/auth‘)

    return app

config.py

# session redis
# 连接redis, 并使用第3个库, 15个随便选
conn = Redis(host=‘127.0.0.1‘, port=6379, password=‘test‘, db=3)
SESSION_TYPE = "redis"
SESSION_KEY_PREFIX = "flask_"  # session以 flask_开头
SESSION_REDIS = conn      # 连接redis

manage.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
from app import create_app, db
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = create_app()             # 初始化app
manager = Manager(app)   # flask_script
migrate = Migrate(app,db)   # 用于迁移数据库

manager.add_command(‘db‘, MigrateCommand)

if __name__ == ‘__main__‘:
    # 启动的时候需要在控制台中 输入 python xx.py runserver -h地址  -p端口
    # manager.run()
    app.run()

authentication下的init.py

from flask import Blueprint

auther = Blueprint(‘auther‘,__name__)

from . import views

authentication下的model.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#

from app import db, login_manager
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin

# 用户登陆模型
class User(UserMixin, db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), unique=True)
    email = db.Column(db.String(40), unique=True, nullable=True)
    password_hash = db.Column(db.String(128))

    @property
    def password(self):
        raise AttributeError("输入错误")

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

# 加载用户回调函数
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

authentication下的views.py

注意, 在使用session 不要导入init.py下的sess 直接使用flask下的全局session, 官网说明 【 您不能直接使用Session实例,Session所做的只是更改Flask应用程序上的session_interface属性】

@auther.route(‘/login‘, methods=["GET", "POST"])
def login():
    if request.method == "GET":
        return render_template(‘authentication/login.html‘)
    if request.method == "POST":
        logdic = request.form.to_dict()
        name = logdic[‘name‘]
        username = User.query.filter_by(name=logdic["name"]).first()
        if username and username.verify_password(logdic["password"]):
            result.code = 10000
            login_user(username)     # 会话保存
            session[‘name‘] = name
            # sess[‘name‘] = name    # 这么写是不行的

            result.url = request.args.get(‘next‘) or url_for("backend.index")
        else:
            result.code = xx
        return 自行定义json

html

只有执行 login_user(querysetObj) 时才会有 current_user.is_authenticated这个参数

{% if current_user.is_authenticated %}
        <ul class="layui-nav layui-layout-right">
                <li class="layui-nav-item">
                        <a href="javascript:;">
                                <img src="http://t.cn/RCzsdCq" class="layui-nav-img">
                                {{ current_user.name }}
                        </a>
                </li>
                <li class="layui-nav-item"><a href="{{ url_for(‘auther.logout‘) }}">退出</a></li>
        </ul>
{% else %}
        <ul class="layui-nav layui-layout-right">
                <li class="layui-nav-item"><a href="{{ url_for(‘auther.login‘) }}">登陆</a></li>
        </ul>
{% endif %}

技术图片

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!