view视图函数
from flask import request, render_template, \
session, redirect, Blueprint, url_for
# 专门管理路由的库: flask-blueprint
# 第一步: 生成蓝图对象
from utils.functions import login_required
blue = Blueprint('first', __name__)
# 第二步: 使用蓝图对象, @blue.route(‘路由’)
# 定义路由
@blue.route('/index/', methods=['GET', 'POST'])
@login_required
def index():
if request.method == 'GET':
return render_template('index.html')
# 3.登陆验证,存储seesion-cookie
@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 == 'vincent' and password == '123456':
# 使用session进行登录状态保持
# TODO: 思考: 键user_id,值1,存储在何处?存储在cookie中
# cookie中k-v,其中k为字符串'session',v为编码后的键值对信息
# 使用session存储数据,需指定secret_key参数
# flask存储session数据,分为两种方式
# 第一种: 将数据存储在cookie中(好处: 服务器不用再存储session数据)
# 第二种: 将数据存储在服务器中
# 1. 当第一次访问访问任何一个url链接时,cookie中都会设置一个键值对
# 键为session,值为uuid类型的数据
# 2. 在服务器redis中会存储uuid的值,
# 以string类型进行存储uuid和设置的键值对信息
# TODO:思考: django中django_session中的数据何时被创建?
# 1. 在使用request.session[key]=value时,cookie中sessionid才会被创建
# 2. django_session中也才会创建数据
session['user_id'] = 1
return redirect('/index/')
return render_template('login.html')
@blue.route('/name/<uname>/',methods=['GET'])
@login_required
def get_name(uname):
return f'uname:{uname}'
@blue.route('/zoo/<int:id>/<int:id2>/<int:id3>/',methods=['GET'])
def zoo(id,id2,id3):
return 'success'
# 4.重定向,反向解析
@blue.route('/redirect/', methods=['GET'])
def my_redirect():
# 重定向: redirect(’跳转的地址‘)
# 反向解析, url_for('生成蓝图对象的第一个参数.重定向的函数名', 参数名=值)
# print(url_for('first.get_name', uname='123'))
# return redirect(url_for('first.get_name', uname='vincent'))
# 无参的跳转
# return redirect(url_for('first.index'))
# 多参的跳转
# url_for('生成蓝图的第一个参数.重定向函数名', 参数1=值1, 参数2=值2...)
return redirect(url_for('first.zoo', id=1, id2=2, id3=3))
function函数
1.装饰器
# 1. 外层函数嵌套内层函数
# 2. 外层函数返回内层函数
# 3. 内层函数调用外层函数的参数
from functools import wraps
from flask import session, redirect
# TODO: 1. 返回函数func()如何接收参数?
# TODO: 2. @wraps(func)的作用?
def login_required(func):
@wraps(func)
def check(*args, **kwargs):
# 步骤1: 先从cookie中取出uuid值
# 步骤2: 从redis中取字符串类型,key为uuid
user_id = session.get('user_id')
if not user_id:
# 没登录
return redirect('/login/')
return func(*args, **kwargs)
return check
manage函数
import redis
from flask import Flask, request, render_template,\
session, redirect
from flask_script import Manager
from flask_session import Session
# 生成对象
from app.views import blue
app = Flask(__name__)
# 设置secret_key
app.secret_key = '123456atshdt745e4w4345487ikhj'
# 设置session
# TODO: 思考,redis中存储数据的类型?
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(host='139.196.79.238',
port=6379,
password='1qaz2wsx')
# 初始化app,方法1
# Session(app)
# 方法2
sess = Session()
sess.init_app(app)
# 第三步: 设置蓝图
app.register_blueprint(blueprint=blue)
if __name__ == '__main__':
manage = Manager(app)
manage.run()