python-flask框架学习(五)
request-Flask的请求对象
请求解析和响应封装大部分是有Werkzeug完成的,Flask子类化Werkzeug的请求(Request)对象和响应(Response)对象,并添加了和程序的特定功能。
1、钩子函数
在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子。其实类似于java中的aop面向切面编程。
1.1、before_first_request函数
只在第一个请求之前调用,第一个请求之后不再调用。一般我们在里面进行对数据库的连接操作等。
@app.before_first_request
def before_first_request():
print("在第一个请求之前调用")
1.2、before_request函数
在每次请求的之前调用,并且在调用的时候不需要传递参数,并且方法中不能加return ,如果加了,其他的视图函数将不会被调用。一般在这个方法里面做请求的校验或者权限的校验,如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数。
@app.before_request
def before_request():
print('每次方法执行前执行')
1.3、after_request函数
在执行完视图函数之后会调用,会接受一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数。
@app.after_request
def after_request(response):
print("方法执行之后执行")
response.headers['Content-Type'] = 'application/json'
return response
1.4、teardown_request函数
请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息。
@app.teardown_request
def teardown_request(e):
print("teardown_request")
1.5、视图函数
@app.route('/')
def index():
return render_template('flask_3.html')
执行后结果:
只在第一次请求前执行
每次方法执行前执行
方法执行之后执行
teardown_request
2、request请求
Flask中的request是一个公共变量,需要导入request。
from flask import Flask,request
2.1、request对象属性
2.1.1、request.args
request.args就是获取请求链接中 ? 后面的所有参数。
# 发起请求
<a href="http://127.0.0.1:8888/index?name=张三&pwd=121212">测试request.args方法</a>
# 获得请求
@app.route('/index')
def index():
print(request.args)
return 'Hello'
# 结果
ImmutableMultiDict([('name', '张三'), ('pwd', '121212')])
2.1.2、request.form
获得请求中的表单数据,用法类似request.args。
# 发起请求
<form method="post" action="login">
<input type="text" name="name" id="name" /><br/>
<input type="password" name="pass" id="pass" /><br/>
<input value="提交" type="submit"/>
</form>
# 接收请求
@app.route('/login',methods = ['POST'])
def login():
print(request.form)
name = request.form.get('name')
pwd = request.form.get('pass')
if(name == '管理员' and pwd == '123456'):
return render_template('index.html',name = name)
# 结果
ImmutableMultiDict([('name', '管理员'), ('pass', '123456')])
2.1.3、request.data
request.data返回的数据是一个bytes类型
数据来源是请求参数属性中的Body。
当请求没有设置Content-Type:application/json时,Body里面的数据都会放到request.data
2.1.4、request.files
文件上传为例
@app.route("/upload", methods=["POST", "GET"])
def upload():
if request.method == "GET":
return render_template("upload.html")
elif request.method == "POST":
files = request.files
if "file" not in files:
return json.dumps({"code": 1, "msg": "上传失败"})
file = files.get("file")
file.save("./static/upload/" + file.filename)
return json.dumps({"code": 0, "msg": "上传成功"})