一、session数据存储在客户端
1、session数据存储在客户端的概念
Flask采用'secure cookie'方式保存session,即session数据是使用base64编码后保存在客户端的cookie中,也就是说无须依赖第三方数据库保存session数据。
2.设置session
from flask import Blueprint, redirect, url_for, request, render_template, session
@blueprint.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
if username == 'coco' and password == '123123':
session['user_id'] = 1
return redirect(url_for('first.hello'))
二、session数据存储在服务端
1.session数据存储在服务端,分为以下三步骤
步骤1: 当客户端发送请求到服务端的时候,服务端会校验请求中cookie参数中的sessionid值,如果cookie中不存在sessionid则认为客户端访问服务端时,是发起了一个新的会话。
步骤2: 如果是新的会话,则服务端会传递给客户端一个cookie,并在cookie中存储一个新的sessionid值,并将相关数据保存在session中。
步骤3: 客户端下次再发送请求的时候,请求上下文对象会携带cookie,通过校验cookie中的sessionid值,即可判断是否是同一会话。
步骤4: 如果校验会话是同一会话,则可以从session中获取到之前保存的数据。
2.安装
pip install flask-session
pip install redis
3.基础语法
# 设置session
session['key'] = value
# 读取session
result = session['key'] :如果内容不存在,将会报异常
result = session.get('key') :如果内容不存在,将返回None
# 删除session
session.pop('key')
# 清空session中的所有数据
session.clear()
4.配置连接redis数据库
import redis
from flask import Flask
from flask_script import Manager
from flask_session import Session
from views import blue
app = Flask(__name__)
app.register_blueprint(blueprint=blue, url_prefix='/app' )
app.secret_key = '1234567890qwertyuiopasdfghjklzxcvbnm'
# 配置session
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port=6379)
# 初始化session和app对象
se = Session()
se.init_app(app)
manage = Manager(app)
if __name__ == '__main__':
manage.run()
5.设置session
from flask import Flask, Blueprint, render_template, \
session, url_for, request, redirect
blue = Blueprint('app', __name__)
@blue.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
if username == 'coco' and password == '123123':
session['user_id'] = 1
return redirect(url_for('app.index'))
@blue.route('/index/')
def index():
return render_template('index.html')
三、flask模板
1.block标签
{% block title %}
{% endblock %}
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
{% block content %}
{% endblock %}
2.extends标签
{% extends 'base.html' %}
3.for标签
{% for i in c %}
{{ i }}
{% else %}
loop.index:循环迭代索引
loop.revindex:循环逆序迭代索引
loop.first:是否第一次迭代
loop.last:是否最后一次迭代
4.if标签
注意:jinja2中没有ifequal标签。
{% if nums ==10 %}
{{ nums }}
{% endif %}
5.宏的使用
{% macro say() %}
今天天气真好
{% endmacro %}
{% macro good_list(id, name, price, nums) %}
编号id:{{ id }}, 名称:{{ name }}, 价格:{{ price }}, 数量:{{ nums }}
{% endmacro %}
{% from 'functions.html' import say %}
{% from 'functions.html' import good_list %}
{{ say() }}
{{ good_list('1', '草莓', '10', '1000') }}
{{ good_list('2', '苹果', '5', '1000') }}
6.解析变量
@blue.route('/temp/')
def temp():
content = [65, 13, 786, 867, 999]
return render_template('temp.html', c=content)
{% block content %}
{{ c }}
{% endblock %}
7.过滤器
注意:可以链式调用过滤器。
{{ content_h2 | safe}}
{{ content_h2_new | striptags }}
{{ content_h2 | length }}
{{ content_h2_new | trim }}
{{ 'python' | upper }}
{{ 'Python' | lower }}
{{ content_h2_new | trim | length }}