当前位置:  首页>> 技术小册>> Flask框架零基础入门与实战开发

在上篇文章中我们学习了Flask框架——路由(Route)、环境配置,这篇文章学习Flask框架——response响应及request请求。

在学习之前,我们简单地了解一下客户端和服务端的请求与响应过程,如下图所示:

很简单,客户端需要访问某个服务器的网站,首先发送Request请求(请求头、请求体和请求行),当服务端接收到我们的Request请求后,就会根据请求的内容来返回Response对象(响应行、响应头、响应体),其中响应体是我们网页显示的内容。

简单了解了请求与响应后,我们开始学习response响应及request请求。

Response响应

可以说响应对象其实是在路由中视图函数返回的值,其中视图函数返回值可以为元组、字符串、字典、对象,

示例代码如下所示:

  1. from flask import Flask, Response, make_response
  2. app=Flask(__name__)

元组

  1. @app.route('/tuple')
  2. def index1():
  3. return ('元组',200)

字典

  1. @app.route('/dict')
  2. def index2():
  3. return {'a':'北京','b':'上海','c':'广州'}

字符串

  1. @app.route('/str')
  2. def index3():
  3. return "字符串"

对象

  1. @app.route('/object')
  2. def index4():
  3. return Response('对象') #使用Response()方法获取对象
  4. if __name__ == '__main__':
  5. app.run(port=8080,debug=True)

运行Flask程序后,分别访问以下URL链接:

  1. http://127.0.0.1:8080/tuple
  2. http://127.0.0.1:8080/dict
  3. http://127.0.0.1:8080/str
  4. http://127.0.0.1:8080/object

网页显示的内容分别为:

  1. 元组
  2. {
  3. "a": "\u5317\u4eac",
  4. "b": "\u4e0a\u6d77",
  5. "c": "\u5e7f\u5dde"
  6. }

字符串

对象
return后面返回字符串其实是做了一个response对象的封装。

注意:返回值为元组数据时,不能以以下形式返回:

  1. return ('a','b','c')

必须要以下面的形式返回:

return ‘内容’,响应码

  1. return '11111',200

打开开发者工具,观察Response Headers内容如下图所示:

这里我们是选取了字典的Response Headers,在Response Headers展示了响应码、媒体类型、字符长度、服务名、访问时间的信息。当返回值为字符串、元组、对象时,媒体类型为text/html的响应对象;

那么我们想在Response Headers响应头中定值属于自己的内容怎么办呢?

这时可以使用make_response()方法获取响应对象,定制请求头,示例代码如下所示:

  1. @app.route('/make_response')
  2. def index5():
  3. response=make_response('make_response') #获取响应对象
  4. response.headers['aaaa']='aaaa' #定值名为aaaa,值为aaaa的响应头内容
  5. return response

这样我们就成功定制了属于自己的响应头,运行结果如下图所示:

当我们返回内容是一个完整的HTML文件,该如何返回呢?

当我们返回内容是一个完整的HTML网页时,该怎么办呢?这时我们可以通过render_template()方法就可以渲染完整的HTML文件为字符类型,其语法格式如下:

  1. render_template('html文件')

准备一个html文件,然后编写以下代码:

  1. from flask import Flask, render_template
  2. app=Flask(__name__)
  3. @app.route('/register')
  4. def register2():
  5. r=render_template('register.html')
  6. return r
  7. if __name__ == '__main__':
  8. app.run(port=8080,debug=True)

运行程序后,访问以下URL链接:

http://127.0.0.1:8080/register
网页返回结果如下图所示:

这样就成功把HTML文件呈现在网页上了,注意:由于render_template()默认是从templates文件夹中获取HTML文件,所以我们一般都是把HTML文件放在templates中,如下图所示:

当然我们也可以创建一个字符串变量,并把HTML文件内容写在字符串变量中,代码如下:

  1. @app.route('/register')
  2. def register():
  3. s='''
  4. html文件代码
  5. '''
  6. return s

当我们HTML代码很长时,写在路由函数就会很长,很麻烦,所以我们一般不会把HTML写在路由函数中。

request请求

我们学习了response响应对象,那么如何发送request请求呢?首先我们创建一个名为register.html文件,代码如下所示:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div>
  9. <form action="/get_data" method="get">
  10. <p><input type="text" name="username" placeholder="请输入用户名"></p>
  11. <p><input type="text" name="address" placeholder="请输入地址"></p>
  12. <p><input type="submit" value="提交"></p>
  13. </form>
  14. </div>
  15. </body>
  16. </html>

我们利用了form标签的action属性,当点击提交时,网页将跳转到get_data网页中,并设置了method值为get,表示提交后发送请求为get请求。

其register.html网页展示内容如下图所示:

Flask示例代码如下所示:

  1. from flask import Flask, render_template
  2. app=Flask(__name__)
  3. @app.route('/register')
  4. def register():
  5. return render_template('register.html') #渲染register.html文件
  6. @app.route('/get_data')
  7. def get_data():
  8. return '提交成功'
  9. if __name__ == '__main__':
  10. 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()方法查看路由表,代码如下图所示:

  1. if __name__ == '__main__':
  2. print(app.url_map) #路由规则表
  3. app.run(port=8080,debug=True)

运行结果如下图所示:

我们发现URL路由中默认只接收GET、HEAD、OPTIONS请求,

其中OPTIONS请求方法的主要用途有两个:

获取服务器支持的HTTP请求方法;

用来检查服务器的性能。

由于没有接收POST请求,所以只是修改HTML中form的method值是不行的,会报如下图错误:

错误大概意思是该方法不被允许请求URL。

这时我们可以通过在app.route中添加接收post请求的方法,代码如下所示:

  1. @app.route('/get_data',methods=['POST'])
  2. def get_data():
  3. return '提交成功'

这时我们的路由表如下图所示:

这时路由表中的get_data只接收了POST、OPTIONS两种请求了,当然我们可以设置更多接收请求的方法,代码如下:

  1. @app.route('/get_data',methods=['POST','GET','...','请求方法'])
  2. def get_data():
  3. return '提交成功'

这样我们再访问http://127.0.0.1:8080/register网页中点击提交按钮就不会保存,并会发送post请求了,如下图所示:


该分类下的相关小册推荐: