Flask[寻觅]
模板
作用
- HTML代码复用
- 网页内容动态显示
使用模板技术,可以将那些可共用的代码放在基础模板里,其他的网页可以继承这个基础模板,也可以用include的方式加载进来。
Jinja2
使用Jinja2模板引擎,通过render_template函数返回一个html文件
这些html文件默认存储在项目根目录下的tempates文件夹中,这个目录是可以自定义的,创建Flask对象时,通过template_folder来设置。
使用ajax技术,前端页面通过ajax向后端发送请求,后端返回用户的具体信息。使用模板,则可以不必使用ajax在前端请求数据,在使用render_template返回html时,会将用户的信息一起返回,由模板引擎根据用户的信息对html进行渲染,以达到相同的效果。
后端数据展示
后端的数据放到前端展示,下面是项目的结构示意
1 | flask_demo/ |
app.py 的内容
1 | from flask import Flask, render_template |
welcome.html的内容
1 |
|
响应对象
是几个常见的视图返回数据的方式
1 | from flask import Flask, jsonify, render_template, Response |
- get_text 返回一个字符串
- get_dict 返回一个字典
- get_json 返回一个json格式的字符串
- get_html 返回一个模板
- get_resonponse 返回一个Response对象
使用谷歌浏览器来查看这几个http响应的类型,1, 4, 5 的Content-Type 是 text/html,2,3的Content-Type 是application/json。这说明,flask会根据视图函数的返回值类型,来决定最终的Content-Type。
Response
Response是Flask中默认使用的响应对象
默认情况下设置为具有HTML mimetype。通常情况下,你不必自己创建这个对象,因为flask.flask.make_response会帮你处理这个问题。
如果你想替换所使用的响应对象,你可以将其子类化,并将 flask.flask.response_class设置为你的子类。
1. make_response
视图函数的返回值,最终会传递给make_response方法,在该方法中,对返回值的类型进行判断,并根据返回值的不同做相应的处理
1 | def make_response(self, rv): |
从上面的代码中可以看到,当视图返回一个字典时,flask会自动使用jsonify进行转换。通常情况下,我们不会在视图中直接返回Response对象,因为make_response会帮我们将返回值封装成Response。但如果你自己相对返回值进行特殊处理,那么直接返回Response对象是可行的,就像get_resonponse函数那样操作。
↑ 以上均复制自COOLPYTHON
2. 利用Response返回图片
直接构造Response对象可以为接口返回图片数据
1 |
|
若不直接创建Response对象,那么你就无法设置mimetype首部
3. 自定义Response
也可自定义Response类,进行个性化的处理,但这个类必须继承Response
1 | class ImageResponse(Response): |
上面定义的ImageResponse类里,default_mimetype 就是image/jpeg, 因此在视图中创建ImageResponse对象时无需再设置mimetype。
4. 替换response_class
flask对象有一个response_class属性,默认是Response,可以将其替换成自定义的响应类。
假设需要实现一个图片服务,返回的数据都是图片,mimetype都是image/jpeg,那么可以这样做
1 | class ImageResponse(Response): |
在image函数,直接返回从图片中读取的数据返回,这些数据最终会被ImageResponse类处理。