Flask请求与响应

492 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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请求方式不被允许浏览器的报错

image-20221126195005415.png

flask通过路由设置当中的methods来设定请求方式

....
@app.route("/",methods = ["GET","POST"])
def index():
    return "这里是首页"
....
Flask request

Flask 接收请求之后,会将请求封装到一个叫做request的变量当中,里面包含了请求方式,请求的头部,请求携带的参数等待,只要导入就可以使用。

from flask import requestrequest.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的请求和响应就先聊到这里了,还是欢迎各位大佬多多指点吧。