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(312)])
    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.运行文件

首先运行程序文件

$ 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,将会看到过期时间.

10302

然后,去查看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
- END -


以上是关于Flask-session使用Memcache存储的主要内容,如果未能解决你的问题,请参考以下文章

flask-session组件

flask-session组件

flask-session

Flask-session用法

flask-session组件

Flask-Session