flask-session 蓝图使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask-session 蓝图使用相关的知识,希望对你有一定的参考价值。
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 %
以上是关于flask-session 蓝图使用的主要内容,如果未能解决你的问题,请参考以下文章