Flask框架——response响应对象及request对象
在上篇文章中我们学习了Flask框架——路由(Route)、环境配置,这篇文章学习Flask框架——response响应及request请求。
在学习之前,我们简单地了解一下客户端和服务端的请求与响应过程,如下图所示:
很简单,客户端需要访问某个服务器的网站,首先发送Request请求(请求头、请求体和请求行),当服务端接收到我们的Request请求后,就会根据请求的内容来返回Response对象(响应行、响应头、响应体),其中响应体是我们网页显示的内容。
简单了解了请求与响应后,我们开始学习response响应及request请求。
Response响应
可以说响应对象其实是在路由中视图函数返回的值,其中视图函数返回值可以为元组、字符串、字典、对象,
示例代码如下所示:
from flask import Flask, Response, make_response
app=Flask(__name__)
# 元组
@app.route('/tuple')
def index1():
return ('元组',200)
# 字典
@app.route('/dict')
def index2():
return {'a':'北京','b':'上海','c':'广州'}
# 字符串
@app.route('/str')
def index3():
return "字符串"
# 对象
@app.route('/object')
def index4():
return Response('对象') #使用Response()方法获取对象
if __name__ == '__main__':
app.run(port=8080,debug=True)
运行Flask程序后,分别访问以下URL链接:
http://127.0.0.1:8080/tuple
http://127.0.0.1:8080/dict
http://127.0.0.1:8080/str
http://127.0.0.1:8080/object
网页显示的内容分别为:
元组
{
"a": "\u5317\u4eac",
"b": "\u4e0a\u6d77",
"c": "\u5e7f\u5dde"
}
字符串
对象
return后面返回字符串其实是做了一个response对象的封装。
注意:返回值为元组数据时,不能以以下形式返回:
return ('a','b','c')
必须要以下面的形式返回:
# return '内容',响应码
return '11111',200
打开开发者工具,观察Response Headers内容如下图所示:
这里我们是选取了字典的Response Headers,在Response Headers展示了响应码、媒体类型、字符长度、服务名、访问时间的信息。当返回值为字符串、元组、对象时,媒体类型为text/html的响应对象;
那么我们想在Response Headers响应头中定值属于自己的内容怎么办呢?
这时可以使用make_response()方法获取响应对象,定制请求头,示例代码如下所示:
@app.route('/make_response')
def index5():
response=make_response('make_response') #获取响应对象
response.headers['aaaa']='aaaa' #定值名为aaaa,值为aaaa的响应头内容
return response
这样我们就成功定制了属于自己的响应头,运行结果如下图所示:
当我们返回内容是一个完整的HTML文件,该如何返回呢?
当我们返回内容是一个完整的HTML网页时,该怎么办呢?这时我们可以通过render_template()方法就可以渲染完整的HTML文件为字符类型,其语法格式如下:
render_template('html文件')
准备一个html文件,然后编写以下代码:
from flask import Flask, render_template
app=Flask(__name__)
@app.route('/register')
def register2():
r=render_template('register.html')
return r
if __name__ == '__main__':
app.run(port=8080,debug=True)
运行程序后,访问以下URL链接:
http://127.0.0.1:8080/register
网页返回结果如下图所示:
这样就成功把HTML文件呈现在网页上了,注意:由于render_template()默认是从templates文件夹中获取HTML文件,所以我们一般都是把HTML文件放在templates中,如下图所示:
当然我们也可以创建一个字符串变量,并把HTML文件内容写在字符串变量中,代码如下:
@app.route('/register')
def register():
s='''
html文件代码
'''
return s
当我们HTML代码很长时,写在路由函数就会很长,很麻烦,所以我们一般不会把HTML写在路由函数中。
request请求
我们学习了response响应对象,那么如何发送request请求呢?首先我们创建一个名为register.html文件,代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<form action="/get_data" method="get">
<p><input type="text" name="username" placeholder="请输入用户名"></p>
<p><input type="text" name="address" placeholder="请输入地址"></p>
<p><input type="submit" value="提交"></p>
</form>
</div>
</body>
</html>
我们利用了form标签的action属性,当点击提交时,网页将跳转到get_data网页中,并设置了method值为get,表示提交后发送请求为get请求。
其register.html网页展示内容如下图所示:
Flask示例代码如下所示:
from flask import Flask, render_template
app=Flask(__name__)
@app.route('/register')
def register():
return render_template('register.html') #渲染register.html文件
@app.route('/get_data')
def get_data():
return '提交成功'
if __name__ == '__main__':
app.run(port=8080,debug=True)
首先我们创建@app.route('/register')路由并将register视图函数来绑定URL:register,,该视图函数作用为渲染register.html文件返回给,再创建@app.route('/get_data')路由并将视图函数绑定在URL(/get_data)中,运行程序并打开http://127.0.0.1:8080/register,如下图所示:
这里我们输入了小明、北京这两个数据,然后点击提交,如下图所示:
可以发现,请求方法是get,跳转的URL为:
http://127.0.0.1:8080/get_data?username=小明&address=北京
那么为什么是这个URL呢,首先我们在HTML设置了action属性,当点击提交时,就会跳转到http://127.0.0.1:8080/get_data页面中,通过问号将表单的值拼接起来,其中username、address分别为HTML文件中input标签的name值。
那么发送post请求是不是只要将HTML文件中,form中的method的值改为post就可以了呢?
答案是:不是。
首先我们通过url_map()方法查看路由表,代码如下图所示:
if __name__ == '__main__':
print(app.url_map) #路由规则表
app.run(port=8080,debug=True)
运行结果如下图所示:
我们发现URL路由中默认只接收GET、HEAD、OPTIONS请求,
其中OPTIONS请求方法的主要用途有两个:
-
获取服务器支持的HTTP请求方法;
-
用来检查服务器的性能。
由于没有接收POST请求,所以只是修改HTML中form的method值是不行的,会报如下图错误:
错误大概意思是该方法不被允许请求URL。
这时我们可以通过在app.route中添加接收post请求的方法,代码如下所示:
@app.route('/get_data',methods=['POST'])
def get_data():
return '提交成功'
这时我们的路由表如下图所示:
这时路由表中的get_data只接收了POST、OPTIONS两种请求了,当然我们可以设置更多接收请求的方法,代码如下:
@app.route('/get_data',methods=['POST','GET','...','请求方法'])
def get_data():
return '提交成功'
这样我们再访问http://127.0.0.1:8080/register网页中点击提交按钮就不会保存,并会发送post请求了,如下图所示:
好了,关于Flask框架——response响应及request请求就讲到这里了,下篇文章学习Flask框架——重定向、url_for!!!
公众号:白巧克力LIN