Flask-session使用Memcache存储
Posted Flask学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask-session使用Memcache存储相关的知识,希望对你有一定的参考价值。
Flask-session使用Memcache存储
前期也讲解过
Memcache
的基本概念,已经如何使用Python
操作Memcache
.如果你有所遗忘,请再次阅读一遍
https://wenyan.online/2020/09/27/flaskmemcache/
接下来,讨论如何将
session
信息写入到memcache
中
1.login.html
像
SQlalchemy
一样,有一些文件是不要变动的.这里我们只需要一个能post
的文件<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
</head>
<body>
<form action="" method="post">
<p><label for="">username:</label><input type="text" name=username></p>
<p><label for="">password:</label><input type="password" name="password"></p>
<p><input type="submit" value="Login"></p>
<p><label for="">30 days remember me</label> <input type="checkbox" name="remember"></p>
</form>
</body>
</html
2.memecacheModel.py
为了构造的合理,这里把
Memcache
相关的都存放在同一个文件中.from pymemcache.client import Client
client = Client(('192.168.0.101', 11211), allow_unicode_keys=True, encoding='utf8')注意: 你需要先启动自己的
memcache
,然后才能正常的连接.
3.config.py
配置文件是重中之重,要在这个文件中指定保存的类型.
# 导入memcache
from memecacheModel import client
import os
DEBUG = True
TEMPLATES_AUTO_RELOAD = True
# 显式关闭CSRF
WTF_CSRF_ENABLED = False
# flask-session
SESSION_TYPE = 'memcached' # 指定类型
SESSION_MEMCACHED = client # memcached实例
SESSION_USE_SIGNER = True # 设定加密
SECRET_KEY = os.urandom(24) # 设定加密秘钥
SESSION_KEY_PREFIX = 'session' # 设定值的前缀注意:上面的
client
实例,是需要导入到文件中的.
4.formModel.py
from flask_wtf import FlaskForm
from wtforms import StringField, BooleanField,IntegerField,PasswordField
from wtforms.validators import Length,EqualTo
class LoginForm(FlaskForm):
username = StringField(validators=[Length(3, 12)])
password = PasswordField(validators=[Length(6.12)])
remember = BooleanField(validators=[])注意:
remember
也就是html redio
点选框,这里使用的是boolean
值判断,如果点选就是True
,没有点选就是False
5.app.py
from flask import Flask
import config
from flask import render_template, redirect,url_for, session,escape
from formModel import LoginForm
from flask_session import Session as Fsession
from datetime import timedelta
from memecacheModel import client
app = Flask(__name__)
app.config.from_object(config)
Fsession(app)
@app.route('/')
def index():
if 'username' in session:
# escape 用来替换html中的16进制特殊符号
return 'Logged in as {}.<a href="/logout/">Logout</a>'.format(escape(session.get('username')))
return 'You are not log in <a href="/login/">Login<a>'
@app.route('/login/', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
# 假设数据库验证通过, 添加 session
user = form.username.data
remember = form.remember.data
session['username'] = user
print(remember)
if remember:
session.permanent = True
app.config.update({'SESSION_COOKIE_LIFETIME': timedelta(days=30) })
else:
session.permanent = False
return 'success'
return render_template('login.html')
@app.route('/logout/')
def logout():
session.clear()
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(注意:
if remember:
判断,点选后,设置永久保存,已经过期时间.
6.运行文件
- END -首先运行程序文件
$ python app.py
为了观察方便,这里连接到了
memcache
,并清空了所有的key/value
$ telenet 192.168.0.101 11211
flush_all # 清空所有key
OK
stats items # 查看所有的key,为空
END尝试在浏览器中访问
127.0.0.1:5000
并登录,如果你点选了radio
,将会看到过期时间.然后,去查看
memcache
stats items
STAT items:3:number 1
STAT items:3:number_hot 0
STAT items:3:number_warm 0
STAT items:3:number_cold 1
STAT items:3:age_hot 0
STAT items:3:age_warm 0
STAT items:3:age 116
STAT items:3:mem_requested 152
STAT items:3:evicted 0
STAT items:3:evicted_nonzero 0
STAT items:3:evicted_time 0
STAT items:3:outofmemory 0
STAT items:3:tailrepairs 0
STAT items:3:reclaimed 9
STAT items:3:expired_unfetched 8
STAT items:3:evicted_unfetched 0
STAT items:3:evicted_active 0
STAT items:3:crawler_reclaimed 0
STAT items:3:crawler_items_checked 21
STAT items:3:lrutail_reflocked 0
STAT items:3:moves_to_cold 24
STAT items:3:moves_to_warm 0
STAT items:3:moves_within_lru 0
STAT items:3:direct_reclaims 0
STAT items:3:hits_to_hot 1
STAT items:3:hits_to_warm 0
STAT items:3:hits_to_cold 15
STAT items:3:hits_to_temp 0
END可以看到已经被创建了一个
id =3
的缓存.查看它的具体内容stats cachedump 3 0 # 3表示id 0 表示所有的内容
ITEM session19a0d005-8469-475f-a465-bffa9716a8f5 [50 b; 1603895548 s]
END以
session
打头的就是我们的key
,因为config.py
中指定了SESSION_KEY_PREFIX = 'session'
,使用get
命令可以查看到value
get session19a0d005-8469-475f-a465-bffa9716a8f5
以上是关于Flask-session使用Memcache存储的主要内容,如果未能解决你的问题,请参考以下文章