开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
之前聊了Flask的基本请求流程和模板渲染技术,并且聊了一个案例,那么这次聊聊Flask的请求和响应吧。
Flask请求
HTTP请求
聊flask请求之前,首先来聊聊HTTP的请求,基于后端工程师来说,首先需要了解HTTP的请求方式:
HTTP 是超文本传输协议,用来定义客户端与服务器数据传输的规范,HTTP协议定义了9种请求方式来表明Request-URL指定的资源不同的操作方式。
| 请求方式 | 描述 |
|---|---|
| GET | 请求获取服务器资源,并返回实体内容。 |
| POST | 表示向指定服务器提交数据,数据包含在请求头当中。 |
| HEAD | 类似于GET请求,只不过返回的响应体当中没有具体的内容,只有报文头,其实就是为了获取报文头的。 |
| PUT | 表示向服务器提交数据取代指定的内容,也就是说上传最新的内容,也是一种修改吧。 |
| OPTIONS | 返回服务器针对特殊资源所支持的HTML请求方式或允许客户端查看服务器特性,比如,axios请求在发起之前就会先发一次options请求,来测试一下服务器的特性,确保请求成功。 |
| DELETE | 用来删除请求服务器的资源 |
| TRACE | 回显服务器收到的请求,主要用来做服务器的测试和诊断。 |
这里要说明一下,并不是服务器端提交数据非得用POST请求,而是使用规范的写法是用POST,遵循规范会让代码的迁移性和可读性更好。
基于Flask的请求
Flask的请求也是依照HTTP协议来设定的,基础部分,我们需要掌握两个点:
Flask请求方式
Flask默认只允许GET请求,如果使用其他的请求方法会报错,需要在指定路由的时候,指定更多的请求方式。
flask请求方式不被允许浏览器的报错
flask通过路由设置当中的methods来设定请求方式
....
@app.route("/",methods = ["GET","POST"])
def index():
return "这里是首页"
....
Flask request
Flask 接收请求之后,会将请求封装到一个叫做request的变量当中,里面包含了请求方式,请求的头部,请求携带的参数等待,只要导入就可以使用。
from flask import request
request.method #返回本次请求的请求方式,比如POST或者GET
request.data #返回请求携带的参数,但是是二进制的数据,需要进行转码
request.args #只接收GET请求的参数,返回的是一个类字典对象
request.form #只接收post的请求方式是formdata的数据,也就是前端表当请求的数据,返回的是一个类字典对象
request.file #接收请求提交的文件对象
request.path #本次请求的地址
这里需要注意:
1、request返回的类字典对象也可以支持字典的所有操作,比如:items, get, keys, values。
2、request还有很多方法,之后的学习过程当中在用到的地方细聊。
Flask响应
Flask是通过视图函数或者视图类返回响应的,支持字符串,字典,列表,元组,Flask响应实例或者wsgi回调函数,其他格式并不支持,直接返回其他格式会报错:
@app.route("/hello",methods = ["GET","POST"])
def index():
return 1 #返回数字报错
按照日常的需求,我们可以把响应的内容分为三种来分析:
1、html内容
(1)flask 会默认以html规则解析返回的字符串当中的html格式,所以简单的html可以使用字符串直接表示
@app.route("/html_page")
def html_page():
return "<h1>hello world</h1>"
(2)复杂的html文件可以使用render_template方法加载,但是render_template实际上也是一个response对象
from flask import render_template
@app.route("/html_page")
def html_page():
return "<h1>hello world</h1>"
2、纯数据格式
比如json对象
flask直接返回字典或者列表或者元组对象,都会被原样解析。
@app.route("/json_data")
def json_data():
return {"name": "laobian"}
3、其他类型对象
对于txt文件,excel,pdf或者其他的特殊格式,flask提供了自定义response对象的方法,可以通过下面的套路(嘿嘿嘿,进行返回)
from flask import make_response #构建response对象
@app.route("/file_data")
def file_data():
response = make_response("hello world") #构建response对象,设置响应内容
#通过设置响应头设置响应数据类型
response.headers.set('Content-Disposition', 'attachment', filename='1.txt')
response.headers.set('Content-Type', 'application/txt')
#返回响应对象
return response
关于flask的请求和响应就先聊到这里了,还是欢迎各位大佬多多指点吧。