02. 模板语言、session、闪现

本文详细介绍了Flask框架中的模板语言使用、请求响应处理,包括请求参数获取、响应对象创建。接着探讨了Session的实现原理和使用方法,以及闪现功能的实现和应用场景。同时,讲解了Flask的请求扩展,如before_request、after_request等装饰器,相当于Django中间件的功能。通过实例代码展示了这些概念的实际运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、模板语言


二、请求响应

from flask import Flask, make_response, jsonify
from flask import request, render_template, redirect

app = Flask(__name__)
from werkzeug.datastructures import CombinedMultiDict
app.debug = True

@app.route('/login.html', methods=['GET', 'POST'])
def login():
    print(type(request.values['name']))  # post和get提交的数据总和 还是个字典
    # print(request.full_path) # 全路径
    # print(request.url)      # 带数据
    # print(request.base_url) # 带域名
    # print(request.files)    # 等同于django中的request.FILES
    # 请求相关信息
    # request.method  提交的方法
    # request.args  get请求提及的数据
    # request.form   post请求提交的数据
    # request.values  post和get提交的数据总和
    # request.cookies  客户端所带的cookie
    # request.headers  请求头
    # request.path     不带域名,请求路径
    # request.full_path  不带域名,带参数的请求路径
    # request.script_root
    # request.url           带域名带参数的请求路径
    # request.base_url		带域名请求路径
    # request.url_root      域名
    # request.host_url		域名
    # request.host			127.0.0.1:500
    # request.files
    # obj = request.files['the_file_name']
    # obj.save('/var/www/uploads/' + secure_filename(f.filename))



    # 响应相关信息
    # return "字符串"
    # return render_template('html模板路径',**{})
    # return redirect('/index.html')
    # return jsonify({'k1':'v1'})

    # response = make_response(render_template('index.html'))
    # response是flask.wrappers.Response类型
    # response.delete_cookie('key')
    # response.set_cookie('key', 'value')
    # response.headers['X-Something'] = 'A value'
    # return response

    # res=make_response('内容xxx') # 响应对象
    # res=make_response(render_template('index.html')) # 响应对象
    res=make_response(jsonify({'name':'cc'})) # 响应对象
    res.set_cookie('name','cc')
    # 向响应头中加东西
    res.headers['xyz']='abc'

    return res


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

三、session及源码分析

1、第一步必须配置秘钥
2、全局导入session对象
3、赋值:session['key']=value
4、取值:session['key']
5、数据加密后放到了cookie中-----(token)
1、源码分析执行流程
2、请求来了在open_session中取出cookie,反解数据,包装成session--->视图函数中使用session
3、只要session修改了,请求走了---》save_session()----> 把session加密,放到cookie中,返回给前端
4、不同的浏览器,cookie不同(示例:同一个浏览器只能同时登录一个用户)

# django中的session如何实现的?
	-原理一模一样,在中间件中,process_request和process_response

四、闪现

1、一些数据,放在某个位置,下次请求再取出来,取完就没有了(flash)
2、访问index--》name=cc, 放在某个位置
3、下次访问order--》把这个数据取出来
4、放到session中可以吗?

5、本质原理:闪现是基于session的
6、使用:
	- 设置 flash('aaa')
	- 取值 get_falshed_message()
   
7、分类
	- 设置:flash('超时错误', category='x1')
	- 取值:data = get_flashed_messages(category_filter=['x1'])

示例:

from flask import Flask,flash,get_flashed_messages,request,redirect

app = Flask(__name__)
app.secret_key = 'asdfasdf'


@app.route('/index')
def index():
    # 从某个地方获取设置过的所有值,并清除。
    val = request.args.get('v')
    if val == 'oldboy':
        return 'Hello World!'
    flash('超时错误',category="x1")
    return "ssdsdsdfsd"
    # return redirect('/error')


@app.route('/error')
def error():
    """
    展示错误信息
    :return:
    如果get_flashed_messages(with_category=True)
    """
    data = get_flashed_messages(category_filter=['x1'])
    if data:
        msg = data[0]
    else:
        msg = "..."
    return "错误信息:%s" %(msg,)

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

五、请求扩展(相当于django中间件)

# 作用:相当于django的中间件,在请求进入视图函数之前和离开视图函数之后执行一些功能

# @app.before_request:请求来之前执行(可以加多个,从上往下执行,等同于中间件的process_request)
# @app.after_request: 请求走之后(可以加多个,从上往下执行,等同于以中间件的process_response)
# @app.before_first_request: 项目运行后的第一次会执行它(初始化的工作)
# @app.teardown_request: 出错也会走,记录日志
# @app.errorhandler(404): 状态码是响应的,就会触发它的执行
# @app.template_global() : 全局函数,在模板中直接使用
# @app.template_filter(): 全局过滤器,在模板中直接使用
from flask import Flask,request, render_template
from flask.views import MethodView

app = Flask(__name__)
app.debug = False
@app.debug = False
# 1 before_request
# @app.before_request
# def before():
#     #取出访问者的ip,记录一下
#     print(request.path)
#     print('我执行了')
#     # return '回去'  # 直接回去了,等同于django中return Response对象


# @app.before_request
# def before2():
#     print('我执行了2222')

# 2 after_request
# @app.after_request
# def after(response):
#     print('我走了')
#     print(response)
#     # response.headers['sss']='sss'
#     #设置cookie
#     return response


# @app.after_request
# def after2(response):
#     print('我走了22222')
#     return response

# 3 before_first_request
# @app.before_first_request
# def first():
#     print('我的第一次给了这个地址',request.environ.get('REMOTE_ADDR'))

# 4 teardown_request
# @app.teardown_request  # 响应走的时候,错误也会走,记录错误日志,前提是debug为false
# def ter(e):
#     print('我一直走')
#     print(e)


# 5 errorhandler
# @app.errorhandler(404)
# def error_404(arg):
#     return "404错误了"
#     # return render_template('好看的模板')

# @app.errorhandler(500)
# def error_500(arg):
#     return "500错误了"

# 6 template_global: 定义全局函数
@app.template_global()
def sb(a1, a2):
    return a1 + a2  # 可以直接在模板中使用 {{sb(1,2)}}

# 7 template_filter:过滤器
@app.template_filter()
def db(a1,a2,a3,a4):
    return a1+100+a2+a3+a4  # 模板中使用 {{ 1|db(2,3)}}

@app.route('/')
def hello_world():
    print('我是视图函数')
    return render_template('index.html', a=100)

if __name__ == '__main__':
    app.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值