如何处理requset,主动终止视图函数并且自己捕获异常
服务器在接收到客户端请求后,会自动创建Request对象,由Flask自动创建,Request对象不可修改。与diango不一样,django中的request对象是在每个视图函数中的,然而flask中的request是全局变量,那它怎样做到隔离的呢?
常用接口
- request.method 请求方式
- request.path 路由中的路径
- request.args get请求参数
get请求参数的包装,args是一个ImmutableMultiDict对象,类字典结构对象
数据存储也是key-value
外层是大列表,列表中的元素是元组,元组中左边是key,右边是value
- request.form post请求参数
存储结构个args一致
默认是接收post参数
还可以接收PUT,PATCH参数
- request.url 完整请求地址
- request.base_url 去掉GET参数的URL
- request.remote_addr 请求的客户端地址
- request.file 上传的文件
- request.headers 请求头
- request.cookie 请求中的cookie
- request.get_json 如果前端传的json,可以调此接口,自动把前端传的json转化为字典
#使用要求前端传递的content-type:application/json
ImmutableMultiDict类型
ImmutableMultiDict类似字典的数据结构
与字典的区别,可以存在相同的键
args、form、files都是ImmutableMultiDict的对象
‘
ImmutableMultiDict数据获取方式
dict['uname']
dict.get('uname') # 推荐(在没有数据为空)
dict.getlist('uname') # 获取指定key对应的所有值
Request使用实例
# coding:utf-8
from flask import Flask, request
app = Flask(__name__)
# 接口 api
# 127.0.0.1:5000/index?city=chongqing&country=china
@app.route("/index", methods=["GET", "POST"])
def index():
# request中包含了前端发送过来的所有请求数据
# form和data是用来提取请求体数据
#当前端通过存表单提交的时候content-type:urlencode的时候,所有数据已经被flask封装到了form里面。
#如果时候form-data多类型数据,可以通过request.data获取
# 通过requset.form可以直接提取请求体中的表单格式的数据, 是一个类字典的对象
# 通过get方法只能拿到多个同名参数的第一个
name = request.form.get("name")
age = request.form.get("age")
name_li = request.form.getlist("name")
# 如果是请求体的数据不是表单格式的(如json格式),可以通过request.data获取
print("request.data: %s" % request.data)
# args是用来提取url中的参数(查询字符串)
city = request.args.get("city")
return "hello name=%s, age=%s, city=%s, name_li=%s" % (name, age, city, name_li)
@app.route("/upload", methods=["POST"])
def upload():
"""接受前端传送过来的文件"""
#如果是文件类型的,可以通过 request.files获取文件
file_obj = request.files.get("pic")
if file_obj is None:
# 表示没有发送文件
return "未上传文件"
#方式一(常规)
# 将文件保存到本地
# # 1. 创建一个文件
# f = open("./demo.png", "wb")
# # 2. 向文件写内容
# data = file_obj.read()
# f.write(data)
# # 3. 关闭文件
# f.close()
#方式二(推荐)
# 直接使用上传的文件对象保存
file_obj.save("./demo1.png")
return "上传成功"
# with open打开文件自动可以关闭流
with open("./1.txt", "wb") as f:
f.write("hello flask")
@app.route("/login", methods=["GET"])
def login():
# name = request.form.get()
# pwd = request.form.get()
name = ""
pwd = ""
if name != "11111" or pwd != "admin":
# 使用abort函数可以立即终止视图函数的执行
# 并可以返回给前端特定的信息
# 1 传递状态码信息, 必须是标准的http状态码
abort(404)
# #2. 传递响应体信息
# resp = Response("login failed")
# abort(resp)
return "login success"
# 定义错误处理的方法
@app.errorhandler(404)
def handle_404_error(err):
"""自定义的处理错误方法"""
# 这个函数的返回值会是前端用户看到的最终结果
return u"出现了404错误, 错误信息:%s" % err
if __name__ == '__main__':
app.run(debug=True)
Response实例讲解
# coding:utf-8
from flask import Flask, request, abort, Response, make_response
app = Flask(__name__)
#比较常规的处理response方式
@app.route("/index")
def index():
# 1 使用元祖,返回自定义的响应信息
# 响应体 状态码 响应头
# return "index page", 400, [("aimaile", "1"), ("City", "c1")]
# return "index page", 400, {"aimaile": "2", "City1": "cq"}
# return "index page", 666, {"aimaile": "3", "City1": "cq"}
# return "index page", "666 aimaile status", {"aimaile": "python1", "City1": "cq"}
# return "index page", "666 aimaile status"
# 2 使用make_response 来构造响应信息
resp = make_response("index page 2")
resp.status = "999 itcast" # 设置状态码
resp.headers["city"] = "cq " # 设置响应头
return resp
# 目前我用得最多的是返回json。
#1、终端和平台交互现在一般都是json。
#2、目前很流行前后分离,前端用vue,前后交互也用json,后台只管数据处理,前端只管渲染数据
@app.route("/list")
def loveCity():
# json就是字符串
data = {
"city": "cq",
"old": 11
}
# json.dumps(字典) 将python的字典转换为json字符串
# json.loads(字符串) 将字符串转换为python中的字典
# json_str = json.dumps(data)
# return json_str, 200, {"Content-Type": "application/json"}
# jsonify帮助转为json数据,并设置响应头 Content-Type 为application/json
# return jsonify(data)
return jsonify(city="cq", country="china")
if __name__ == '__main__':
app.run(debug=True)