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_request
和after_request,
- 注意有多个的情况,执行顺序
- before_request请求拦截后(也就是有return值),response所有都执行