tips for Flask

14.1

Flask会特殊对待末端带有斜线的路由。如果客户端请求的URL的末端没有斜线,而唯一匹配的路由末端有斜线,Flask会自动响应一个重定向,转向末端带斜线的URL。反之则不会重定向。resource   > resource/

resource/  > resource

REST架构不要求必须为一个资源实现所有的请求方法。如果资源不支持客户端使用的请求方法,响应的状态码为405,返回“不允许使用的方法”。Flask会自动处理这种错误。

版本问题:因为服务器和客户端分离,服务器负责提供资源,所以需要支持不同版本的客户端应用,使用更多的服务器控件,比如同时拥有/api_1_0 和 /api_1_1 的URL。

内容协商:根据客户端请求的格式改写错误处理程序的响应(json or html)

14.2.3

由于REST要求保持的 无状态 特性,所以我们使用REST支持的HTTP认证(基本认证Base authentication, 摘要认证Digest authentication)

HTTP认证使用模块:from flask_httpauth import HTTPBasicAuth

这种用户认证方法只在API蓝本中使用,所以Flask-HTTPAuth扩展只在蓝本包中初始化,而不像其他扩展那样要在程序包中初始化(不在__init__.py中初始化)。


14.2.4基于令牌的认证

使用from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

在User实现generate_auth_token(self, expiration)和verify_auth_token(token)完成验证功能。

实现用于HTTPBasicAuth的回调函数verify_password。

错误处理:


14.2.5json序列化

错误处理:可以自定义ValidationError,然后raise ValidationError()

 


14.2.6实现资源端点

 实现GET的资源请求最简单,一个返回文章列表,一个返回单篇文章内容。

POST把一篇新的文章内容插入数据库

PUT修改一篇文章

14.2.7分页大型资源集合

对于大型资源集合而言,一个GET请求可能太大,所以也可以对GET请求的get_posts路由进行分页

14.2.8 使用HTTPie测试Web服务

最常使用的两个在命令行中测试Web服务的客户端是curl和HTTPie。后者的命令行更简洁,可读性也更高。

(遇到了一个bug),安装后可以在命令行中通过http命令使用HTTPie,

http --json --auth "john@example.com":"cat" GET http://127.0.0.1:5000/api/v1.0/posts/

注意url使用posts/和posts的区别。

http --auth <email>:<password> --json GET http://127.0.0.1:5000/api/v1.0/token  可以获得认证令牌

15.1获取代码覆盖报告

代码覆盖工具用来统计单元测试检查了多少程序功能,并提供一个详细的报告,说明那些代码没有测试到。

我们使用coverage完成任务,需要在设置中自己配置环境变量FLASK_COVERAGE

 

15.2.1FLASK测试客户端

视图函数因为涉及session和request所以必须在运行时测试,为此可以使用flask内建的测试客户端。

response.get_data(as_text=True),在响应中使用get_data可以获得响应主体,默认为字节数组,as_text=True将返回一个unicode字符串。

在测试的时候FLASK-WTF的post请求会有一个隐藏字段包含一个CSRF保护的令牌,在测试用可以配置中通过WTF_CSRF_ENABLED=False禁用这个字段。

 15.2.2测试Web服务

#注意编码处理

json.dumps编码为json,json.loads从json解码

15.3使用Selenium进行端到端的测试

依赖运行在客户端浏览器中的JavaScript代码,任何程序都无法正常工作,因为响应发给测试的JavaScript代码无法像在真正的Web浏览器客户端中那样运行。如果测试需要完整的环境,除了使用真正的Web浏览器连接Web服务器中运行的程序外,别无他选。幸运的是,大多数浏览器都支持自动化操作。Selenium(http://www.seleniumhq.org/)是一个Web浏览器自动化工具,支持3种主要操作系统中的大多数主流Web浏览器。

16.性能

数据库长期使用以后可能变慢,我们使用大部分数据库查询语言都支持的explain语句,通过显示的数据库执行一个查询时采取的操作步骤,我们可以判断出数据库或索引设计的不足之处。

16.2分析源码

性能问题的另一个诱因是CPU密集运算,Flask使用的开发Web服务器由Werkzeug提供,可根据需要为每条请求启用Python分析器。

17部署

17.1部署流程

在manage.py中写入一个部署命令deploy

17.2生产环境中的错误写入日志

在程序启动过程中,Flask会创建一个Python提供的logging.Logger类实例,并将其附属到程序实例上,得到app.logger。

17.3云部署


heroku addons:create heroku-postgresql:hobby-dev -a minicocol (命令和书中有出入,应该是更新了)

循环尝试git add <file address>

git commit -m "..."

git push heroku(remote git server) master(local git branch)

heroku run python manage.py deploy

heroku logs(git log)

...

记得requirements里的flask-wtf alemic flask-migrate等等版本和local实际使用的一样。

原文地址:https://www.cnblogs.com/autoria/p/6091414.html