首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
编写你的第一个Flask程序
Flask路由(Route)、环境配置
Flask中的response响应对象及request对象
Flask重定向(redirect)、url_for
Flask模板复用(继承、包含、宏)
Flask蓝图、flask-script
Flask数据库配置及迁移同步
Flask数据库操作(增删改查)
Flask模型关系(1对多)
Flask模型关系(多对多)
Flask Session与Cookie
flask-caching缓存
Flask消息闪现
Flask表单数据验证、CSRF保护
Flask文件上传、验证码
Flask-Mail邮件
Flask基于类视图
Flask项目可安装化
Flask应用错误处理
当前位置:
首页>>
技术小册>>
Flask框架零基础入门与实战开发
小册名称:Flask框架零基础入门与实战开发
在上篇文章中我们学习了Flask框架——路由(Route)、环境配置,这篇文章学习Flask框架——response响应及request请求。 在学习之前,我们简单地了解一下客户端和服务端的请求与响应过程,如下图所示: ![](/uploads/images/20230706/ccf3d64751c0ba05fc0c21b551266808.png) 很简单,客户端需要访问某个服务器的网站,首先发送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内容如下图所示: ![](/uploads/images/20230706/46a5268c555b82d80bea50004cbb2ce6.png) 这里我们是选取了字典的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 ``` 这样我们就成功定制了属于自己的响应头,运行结果如下图所示: ![](/uploads/images/20230706/16c5577f93455b2e69a6b030379ed56e.png) 当我们返回内容是一个完整的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 网页返回结果如下图所示: ![](/uploads/images/20230706/be501dc25a5ca9ce434c4db55fe43561.png) 这样就成功把HTML文件呈现在网页上了,注意:由于render_template()默认是从templates文件夹中获取HTML文件,所以我们一般都是把HTML文件放在templates中,如下图所示: ![](/uploads/images/20230706/7b8e5f5e83daa9227dbbd9ab970162a0.png) 当然我们也可以创建一个字符串变量,并把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网页展示内容如下图所示: ![](/uploads/images/20230706/8857912a3af0c4f30cf29f625011e6d0.png) 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, 如下图所示: ![](/uploads/images/20230706/8857912a3af0c4f30cf29f625011e6d0.png) 这里我们输入了小明、北京这两个数据,然后点击提交,如下图所示: ![](/uploads/images/20230706/5e46f0f30fbe8997116aa87947848350.png) 可以发现,请求方法是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) ``` 运行结果如下图所示: ![](/uploads/images/20230706/1cee76ac5104eb0b43f599b5dc88042f.png) 我们发现URL路由中默认只接收GET、HEAD、OPTIONS请求, 其中OPTIONS请求方法的主要用途有两个: 获取服务器支持的HTTP请求方法; 用来检查服务器的性能。 由于没有接收POST请求,所以只是修改HTML中form的method值是不行的,会报如下图错误: ![](/uploads/images/20230706/cf7c6d39e128c51439cb5c907aed2c72.png) 错误大概意思是该方法不被允许请求URL。 这时我们可以通过在app.route中添加接收post请求的方法,代码如下所示: ``` @app.route('/get_data',methods=['POST']) def get_data(): return '提交成功' ``` 这时我们的路由表如下图所示: ![](/uploads/images/20230706/baa73dbcc47675c7dea5d0f9afd79c17.png) 这时路由表中的get_data只接收了POST、OPTIONS两种请求了,当然我们可以设置更多接收请求的方法,代码如下: ``` @app.route('/get_data',methods=['POST','GET','...','请求方法']) def get_data(): return '提交成功' ``` 这样我们再访问http://127.0.0.1:8080/register网页中点击提交按钮就不会保存,并会发送post请求了,如下图所示: ![](/uploads/images/20230706/f6f347a197c0dd92c3fbf0a0bcd5689a.png)
上一篇:
Flask路由(Route)、环境配置
下一篇:
Flask重定向(redirect)、url_for
该分类下的相关小册推荐:
Flask框架入门指南