Сессия фреймворка Flask от входа до мастерства (9)

Flask

Очки знаний: 1. Сессия

1. Обзор

В прошлой статье мы говорили о куках, помимо куки есть еще механизм под названием сессия. Сеанс также может хранить некоторую информацию. Некоторую конфиденциальную и важную информацию мы можем хранить в сеансе. Никто не хочет, чтобы их баланс и пароль банковской карты хранились в файлах cookie. Комбинация файлов cookie и сеансов. С момента развития веб-разработки появилось несколько очень зрелых решений для использования файлов cookie и сеансов. На современном рынке или предприятии обычно существует два метода хранения:

Хранится на сервере: Session_id хранится через файл cookie, а затем конкретные данные хранятся на сеансе. Если пользователь уже вошел в систему, сервер будет сохранять сеанс_Ид в файле cookie, и в следующий раз, когда запрос сделан снова, сеанс_Ид будет передан, и сервер получит данные сеанса пользователя из библиотеки сеанса в соответствии с идентификатор сессии. Вы можете знать, кто пользователь и некоторая информация, сохраненная ранее. Этот технический термин называется сеансом Server Side.

Зашифруйте данные сеанса и храните его в cookie. Этот тип терминологии называется сеансом на стороне клиента. Фладка таким образом, но она также может быть заменена другими формами.

2. Сессия

На каждом веб-сайте есть функция входа в систему. После успешного входа нет необходимости повторно входить в систему в течение определенного периода времени. Если логин остается в этом состоянии, мы можем сделать это через сессию. Сеанс в колбе должен быть установленSECRET_KEY

from flask import Flask, request, render_template, session, redirect
from datetime import datetime

app = Flask(__name__)

app.config['SECRET_KEY'] = 'laowangaigebi'  # 设置session加密的密钥


@app.route('/login', methods=['GET', 'POST'])  # 支持get、post请求
def login():  # 登录视图函数
    # 模拟登录成功后把uid和username存到session里
    session['uid'] = '123456'
    session['username'] = 'laowang'
    return redirect('/')  # 登录成功后到首页


@app.route('/', methods=['GET', 'POST'])  # 支持get、post请求
def index():
    username = session.get('username')  # 取session
    if username:
        return 'welcome %s' % username
    else:
        return '请登录'


app.config['DEBUG'] = True

if __name__ == '__main__':
    # 0.0.0.0代表任何能代表这台机器的地址都可以访问
    app.run(host='0.0.0.0', port=5000)  # 运行程序

Главная Давайте сначала посетим домашнюю страницу:

在这里插入图片描述
Затем я нажимаю «Пожалуйста, войдите в систему» ​​и переходите на страницу входа:http://0.0.0.0:5000/loginОн вернется на главную страницу:
在这里插入图片描述
Давайте откроем новую вкладку браузера и посетим домашнюю страницу:
在这里插入图片描述
Flask шифрует информацию о сеансе и сохраняет ее в файле cookie. Давайте взглянем:
在这里插入图片描述

3. Срок годности

Если срок действия сессии не установлен. Затем по умолчанию срок действия истекает при закрытии браузера. Если установлено значение session.permanent=True, по умолчанию срок действия истекает через 31 день. Если вы не хотите, чтобы срок действия истекал через 31 день, вы можете установить для app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hour=2) срок действия через два часа.

В-четвертых, удалить сеанс

Удалить значение в сессии: оно тоже похоже на словарь. Есть три способа удалить значение в сеансе. session.pop(ключ) удалить сеанс [ключ] сеанс.очистить()

5. Сохраните сеанс на стороне сервера

Мы можем использовать flask-session для хранения сессии на сервере, ведь данные сессии важнее и хранить их в браузере небезопасно.

flask-session поддерживает хранение сессий в различных базах данных

  • redis
  • memcached
  • filesystem
  • mongodb
  • sqlalchmey

Нам лучше хранить сеанс в базе данных Redis на уровне памяти, которая быстрее читается и пишется.

Первая установка фляжной сессии

pip install flask-session
pip install redis

Затем запускаем наш редис и прописываем в коде следующую конфигурацию.

from flask import Flask, request, session
import redis
from flask_session import Session

# 初始化Session对象
f_session = Session()

app = Flask(__name__)

app.config['SECRET_KEY'] = 'laowangaigebi'  # 加密的密钥
app.config['SESSION_USE_SIGNER'] = True  # 是否对发送到浏览器上session的cookie值进行加密
app.config['SESSION_TYPE'] = 'redis'  # session类型为redis
app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前缀
app.config['PERMANENT_SESSION_LIFETIME'] = 7200  # 失效时间 秒
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', db=4)  # redis数据库连接

# 绑定flask的对象
f_session.init_app(app)


@app.route("/")
def index():
    session['xingming'] = 'laozhao'
    return '存session'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

Запустите программу.

在这里插入图片描述
Это идентификатор сеанса браузера. Это не значение сеанса, вы можете зайти в базу данных Redis, чтобы посмотреть.
在这里插入图片描述
Добро пожаловать, чтобы обратить внимание на мой общедоступный номер:

image