Flask框架【四】—Flask请求和响应对象
一、Flask请求对象request
在django中,请求对象request被封装在django中,我们在视图函数无时不再传递使用,而在Flask中,request已经是一个全局的变量了,需要我们导入才能使用。
1.request的属性
-
request.method:获取请求的方法,POST
-
request.args: 获取URL的查询参数,返回ImmutableMultiDict
-
request.args.to_dict():查询参数转化为dict,{'id': '1'}
-
request.form:获取FormDage中的文件数据,ImmutableMultiDict
-
request.values:获取Form和Args中的数据,CombinedMultiDict
-
request.path:路由地址,如/login
-
request.full_path:获取URL的全路径
-
request.url:获取访问的全路径
-
request.base_url:获取URL路径,不带参数的部分
-
request.cookies:获取cookies中的数据
-
request.headers:获取请求头中的数据
使用实例
from flask import Flask from flask import request app = Flask(__name__) @app.route('/login.html', methods=['GET', "POST"]) def login(): # 请求相关信息 request.method # 获取请求的方法,POST request.args # 获取URL的查询参数, ImmutableMultiDict([('id', '1')]) request.args.to_dict() # 查询参数转化为dict,{'id': '1'} request.form # 获取FormDage中的文件数据,ImmutableMultiDict([('username', '123'), ('password', '123')]) request.values # 获取Form和Args中的数据,CombinedMultiDict([ImmutableMultiDict([('id', '1')]), ImmutableMultiDict([('username', '123'), ('password', '123')])]) request.path # 路由地址,如/login request.full_path # 获取URL的全路径 request.url # 获取访问的全路径 request.base_url # 获取URL路径,不带参数的部分 request.cookies # 获取cookies中的数据 request.headers # 获取请求头中的数据 request.url_root request.host_url request.script_root request.host request.files # 获取Form提交的文件数据 obj = request.files['the_file_name'] obj.save('/var/www/uploads/' + secure_filename(f.filename)) request.json # 请求头为Content-type:application/json的数据序列化后存在request.json中 request.data # 请求头Content-type,不包含 Form or data的数据存在这里 return "content" if __name__=="__main__": app.run()
2.form文件上传
视图函数写法
from flask import Flask, render_template, request app = Flask(__name__) app.secret_key = "asdfnlasdlfnl" app.debug = True @app.route("/login",methods=["GET","POST"]) def upload(): if request.method == "POST": file = request.files.get("my_file") # 获取上传文件的键 file.save(file.filename) # 保存文件,根据上传的文件名 return "上传成功" if __name__ == '__main__': app.run()
前端页面
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="my_file"> <input type="submit" value="上传"> </form>
二、Flask响应对象Response
1.响应方法
1.响应字符串
对比django中,我们返回字符串的方式是通过HttpResponse来返回,Flask中直接return一个字符串即可。
@app.route("/") def home(): return "Hello World!"
2.返回模板文件
from flask import render_template @app.route("/") def home(): return render_template('html模板路径',**{})
3.重定向
from flask import redirect @app.route("/") def home(): return redirect('/index.html')
4.其他响应方法
response = make_response(render_template('index.html')) response是flask.wrappers.Response类型 response.delete_cookie('key') # 删除cookie某个键 response.set_cookie('key', 'value') # 设置cookie的键 response.headers['X-Something'] = 'A value' # 设置响应头信息 return response
2.两个特殊封装
1.jsonify
通过jsonify返回,会在响应头中添加Content-type:application/json
在Flask 1.1.1 版本中 加入了 直接返回字典 可以不再使用jsonify了
@app.route("/json") def my_jsonify(): return jsonify({"a":1}) # return {"k":"v"} # 1.1.1版本后可以直接返回字典
2.send_file
发送文件,会自动打开文件并发送文件中的内容,而且能够识别文件类型,在响应头中自动添加Content-type:文件类型。
注意:当浏览器无法识别Content-type时,会下载该文件
@app.route("/my_file") def my_file(): return send_file("1.jpg") # 识别为图片,相对路径 # return send_file("1.zip") # 不能识别,自动下载
衣带渐宽终不悔,为伊消得人憔悴!