2017年2月18日14:26:47
开始进入动态生成html数据(即针对用户request的response)环节,必须要使用Template了。依然从阅读文档开始。
Rendering Templates — Flask Documentation (0.12)当中有个例子,根据这个例子我们知道可以往template里面传入参数,那么在接收到用户request时,我们可以首先解析出用户的数据,然后根据用户去查询对应信息,并将它传送给template。
刚尝试在application.py当中import requests,在启动flask的时候遇到如下问题:
(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> flask run
Usage: flask run [OPTIONS]
Error: The file/path provided (application) does not appear to exist. Please verify the path is correct. If app is not on PYTHONPATH, ensure the extension is .py
(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
搜索之下发现这与virtualenv的使用有关。参看之前的requests使用笔记得知requests需要单独安装,于是在venv下使用pip install requests安装requests,便可以成功启动。
给templete传入参数
测试时发现调用render_template()传入参数时提示参数过多的问题,在阅读stackoverflow上一篇问答之后解决。
template支持的编码
上一个问题解决之后,在调用render_template生成html时出现了UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position,搜索之下在stackoverflow另一篇问答中提到:
Jinja2 is using Unicode internally which means that you have to pass Unicode objects to the render function or bytestrings that only consist of ASCII characters.
简而言之,给render_template传入的参数需要是unicode编码的。
template传递字典
现在已经搞定了天气查询,天气查询的返回结果仅仅是一个字符串,但是历史记录则包含了许多内容,可以直接传递吗?答案是可以的,在template文件里面直接使用就行,这个时候模板设计者文档 — Jinja2 2.7 documentation这篇文档就很好了,我是参照了其中的遍历字典示例。
结果演示
1.查询功能

2.帮助信息

3.历史记录

4.异常操作
查询城市为空

无效城市提示

没有历史记录

好吧,到这里,基本功能已经实现。