day115-Flask的session&路由参数&实例化配置&对象配置&蓝图&特殊装饰器(中间件)

2020-04-21 10:01:57 浏览数 (1)

1.基于Flask的session的认证校验简单实例

1.秘钥

2.登录写进session

3.装饰器&视图校验

4.路由中定义 endpoint 参数

代码语言:javascript复制
from flask import Flask, render_template, redirect, request, session

app = Flask(__name__)

# step1:给一个秘钥
app.secret_key = 'Leon ' s secret_key'


@app.route('/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # step2 登录的时候将秘钥写进来
        session['user'] = request.form.get('username', '')
        return redirect('/detail')
    return render_template('login.html')


# step3:定义一个视图检验的装饰器
def is_login(func):
    def inner(*args, **kwargs):
        if not session.get('user'):
            return redirect('/')
        res = func(*args, **kwargs)
        return res

    return inner


# step4:必须声明 endpoint 参数,一般就是被装饰的函数名
@app.route('/detail', endpoint='detail')
@is_login
def detail():
    return 'This is  detail page'


if __name__ == '__main__':
    app.run()

2.Flask的路由参数

代码语言:javascript复制
@app.route(
    '/router',
    endpoint='router_test',     # 默认是视图函数名
    methods=['GET', 'POST'],    # 视图函数的请求方式
    defaults={'key': 'value'},  # 指定键值对,必须在视图函数中接收
    # redirect_to='/',          # 直接强制重定向,不再走视图函数
)
def router_test(key):
    print(key)
    return 'ok'
代码语言:javascript复制
# http://127.0.0.1:5000/params/123/xxx
@app.route('/params/<int:nid>/<string:str_code>')  # 指定格式传入 int 、 str,视图函数中必须接收
def params(nid, str_code):
    print(nid)
    print(str_code)
    return render_template('index.html')

3.Flask的实例化配置

代码语言:javascript复制
# 主要就是前三条
app = Flask(
    __name__,
    template_folder='templates',  # 指定存放 HTML文件的文件夹名字
    static_folder='static',       # 存放静态资源的文件夹名字
    static_url_path='/static',    # 存放静态资源的路径

    # host_matching=False,        # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数
    # subdomain_matching=False,   # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里
    # instance_path=None,         # 指向另一个Flask实例的路径
    # instance_relative_config=False,  # 是否加载另一个实例的配置
    # root_path = None            # 主模块所在的目录的绝对路径,默认项目目录
)

4.app的config配置

4.1新建一个 appconfig.py的配置文件

代码语言:javascript复制
class Debug(object):
    DEBUG = True
    SECRET_KEY = "12345678"


class Testing(object):
    TESTING = True
    SECRET_KEY = "87654321"


class Develop(object):
    SECRET_KEY = "hello world"

4.2在主app中config.from_object配置即可

代码语言:javascript复制
from flask import Flask, render_template, redirect, request, 
    session, send_file
from config import appconfig
from flask import blueprints
import biueapp

app = Flask(__name__)

# step1:给一个秘钥
# app.secret_key = 'Leon ' s secret_key'
# 
app.config.from_object(appconfig.Debug)

5.Flask的蓝图

5.1 新建一个 py 文件

代码语言:javascript复制
from flask import Blueprint

user_blue = Blueprint(
    'user_app',
    __name__,
    url_prefix='/blue'  # 定义一个前缀
)


@user_blue.route('/hello')  # http://127.0.0.1:5000/blue/hello
def func():
    return 'hello!'

5.2在主app中注册

代码语言:javascript复制
from flask import Flask, render_template, redirect, request, 
    session, send_file
from flask import blueprints
import biueapp

app = Flask(__name__)


# 注册
app.register_blueprint(biueapp.user_blue)

6.flask中的特殊装饰器

6.1before_request & after_request

before_request 在请求到来之前执行

after_request 在请求返回时执行

代码语言:javascript复制
@app.before_request
def before_1():
    print('before_1')


@app.before_request
def before_2():
    print('before_2')


@app.before_request
def before_3():
    print('before_3')


@app.after_request
def after_1(response):
    print('after_1')
    return response


@app.after_request
def after_2(response):
    print('after_2')
    return response


@app.after_request
def after_3(response):
    print('after_3')
    return response

6.1.1执行顺序

6.1.2任何一个 before_request 的终止都不会影响 after_request 的执行进程

6.2errorhandler接受 404 报错信息返回

代码语言:javascript复制
@app.errorhandler(404)
def error_handler(args):
    print(args)
    return 'This is a 404 error page'

0 人点赞