Flask入门之二

Flask入门之二

request对象方法

与django类似,在视图函数中使用,只不过不需要在入参里写request

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

app = Flask(__name__)


@app.route('/login.html', methods=['GET', "POST"])
def login():
    # 请求相关信息
    # request.method  提交的方法:GET/POST
    # request.args  get请求提及的数据
    # request.form   post请求提交的数据
    # request.values  post和get提交的数据总和
    # request.values.getlist('name') 数据中有重名的变量时,这样可以返回一个名为name的值的列表
    # request.cookies  客户端所带的cookie
    # request.headers  请求头
    # request.path     不带域名,请求路径
    # request.full_path  不带域名,带参数的请求路径
    # 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 "内容"

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

response对象方法

直接使用,看不到response对象,可以使用make_response获得这个对象,然后操作cookie,请求头一类的

from flask import Flask,jsonify,make_response
# 上一篇博客里讲的lowb三板斧
return "字符串"
return render_template('html模板路径',**{})
return redirect('/index.html')

# 相当于django中的JsonResponse,需要在flask导入
# 放一个字典,可以转成json字符串
return jsonify({'k1':'v1'})

aa='hello world'
# 返回aa,但是aa不是django中的response对象,如果要设置cookie,需要一个对象去set_cookie
res=make_response(aa)
# 用make_response生成一个对象,在这里设置cookie
res.set_cookie('xxx','lqz')
# 往响应头中放东西
res.headers['X-Something'] = 'A value'
print(type(res))

response = make_response(render_template('index.html'))
response是flask.wrappers.Response类型
# 删除cookie
response.delete_cookie('key')
return response

Session

from flask import Flask,session
SECRET_KEY = 'abc'
# 使用session,必须配置一个secret_key,否则报错
# 导入session
# 视图函数中像操作字典一样操作session 
session['key']=value
# 删除
session.pop('key')
# 取
session['key']

内置的session,flask直接当作cookie,加密一下返回给浏览器了,如果想存redis或者别的操作,可以指定session类,自己写类或者用第三方完成扩展

app.session_interface = 自己写的或第三方类

# 类需要重写三个方法:
open_session
# 请求来,获取cookie的值到一个字典中,如果没有值,返回一个空,有值,则用get_signing_serializer解码

save_session
# 请求走,把内容,过期时间等信息加密放进cookie里
# 内部有监测session.modified,是否session有被动过,动过了就更新整个session(过期时间一类的会刷新)

get_signing_serializer
# 获取secret_key 里面有load和dump方法,可以加密或者解密

闪现

基于session实现的,所以使用闪现,必须要有secret_key。在一个请求中设置闪现,可以在后面的请求里拿到这个闪现的值。

from flask import Flask, flash
# 需要导入flash
# 设置
flash('aaa')
# 取值
get_flashed_message()
# 设置
flash('bbb',category='error1')
# 取值
res=get_flashed_messages(category_filter=['error1'])
# 假设在a页面操作出错,跳转到b页面,在b页面显示a页面的错误信息

注意如果闪现多个值,可以一次取出来,下次再取就取不到了(一次性的消息)

请求扩展

类似于django的中间件,请求来或者走的时候做点事情,也是基于装饰器实现的

# 1 请求来了就会触发,类似于django的process_request,如果有多个,顺序是在文件中从上往下
@app.before_request
def before(*args,**kwargs):
    if request.path=='/login':
        return None
    else:
        name=session.get('user')
        if not name:
            return redirect('/login')
        else:
            return None
# 2 # 请求走了就会触发,类似于django的process_response,如果有多个,顺序是从下往上执行
@app.after_request
def after(response):
    print('我走了')
    return response

#3 before_first_request 项目启动起来第一次会走,以后都不会走了,也可以配多个(项目启动初始化的一些操作)
@app.before_first_request
def first():
    print('第一次')
    
# 4 每次视图函数执行完了都会走它,# 用来记录出错日志
@app.teardown_request  # 用来记录出错日志
def ter(e):
    print(e)
    print('我是teardown_request ')

    
# 5 errorhandler绑定错误的状态码,只要码匹配,就走它
@app.errorhandler(404)
def error_404(arg):
    return render_template('error.html',message='404错误')

# 
# 6 全局标签
@app.template_global()
def sb(a1, a2):
    return a1 + a2
# 在模板中:{{ sb(3,4) }}

# 7 全局过滤器
@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3
# 在模板中{{ 1|db(2,3)}}
  • 常用的就是 before_requestafter_request,
  • 注意有多个的情况,执行顺序
  • before_request请求拦截后(也就是有return值),response所有都执行
posted @ 2020-08-27 09:53  黑猫警长紧张  阅读(151)  评论(0编辑  收藏  举报