声明:这篇文章主要面向python/Flask/web后端初级开发者,文章主要讲解了如何搭建一个基于Flask的纯web后台项目,以及相关的知识原理。不涉及部署相关操作。由于接触web开发不久,难免会有疏漏的地方,请读者指正。
下面是文章中会涉及到的内容:
HTTP请求发送到后端与响应的过程
Why Flask & 概览
Flask的常用工具和项目配置
pycharm
HTTP requester
redis
从第一个路由注册接口开始
使用装饰器处理接口必填字段
Flask上下文获取request参数
错误处理
数据库连接池
循环引用的那些坑
封装加密方法
ORM与Model
celery多线程、异步任务
设置response模板
完整的注册接口
使用Blueprint进行模块划分
总结与展望
前言
前些日子转了python后台开发=。= 说实话现在对后端更有兴趣。我很享受这种不管做什么都是在学习新的知识的感觉,像新生儿一样对这个世界充满好奇。
这篇文章总结了我最近一段时间的学习成果:使用Flask框架搭建一个可扩展的中小型web service,并在其中加上一些原理的阐述或者链接。在本文中以实际的用户模块为例。之所以写这篇文章是因为自己在入门的时候遇到了很多坑,文档或者个人博客并不能满足我的需要,不是很基础(毫无架构可言,而且大多是不实用的博客项目)就是特别复杂。在此感谢我的同学/同事evolsnow,在开发学习过程中给了我很大的帮助。也希望这篇文章能帮到想入门python/Flask的同学。
HTTP请求发送到后端与响应过程
在进行项目搭建之前,我们先大致回顾一下一个HTTP请求是如何发送至后端并且响应的。
通讯双方进行连接
首先通讯双方遵从HTTP协议。当我们输入这样一个请求:http://www.test.com/api/info ,首先请求端会进行DNS解析,把http://www.test.com 变成一个ip地址,如果url里不包含端口号,则会使用该协议的默认端口号。通过ip地址和端口,三次握手建立一个tcp连接。
请求:连接成功建立后,开始向web服务器发送HTTP请求。Flask通过wsgi协议传递请求。
响应:接到请求后,交给相应路由处理,根据地址转发给相应的控制器(函数)处理。后端大部分工作就是写这些处理过程。处理完成后将最终的response返回给用户。这其中我们拿到的request与response都是由python的wsgi工具包werkzeug提供的。
关闭连接:通讯双方均可关闭socket结束tcp/ip会话。
关于wsgi:wsgi协议将处理请求的组件按照功能及调用关系分成了三种:
server
middleware
application。
其中,server可以调用middleware和application,middleware可以调用application。
符合WSGI的框架对于一次HTTP请求的完整处理过程为:
server读取解析请求,生成environ和start_response,然后调用middleware;
middleware完成自己的处理部分后,可以继续调用下一个middleware或application,形成一个完整的请求链;
application位于请求链的最后一级,其作用就是生成最终的响应。
如需更深入了解该过程,可以查看WSGI、Werkzeug。
一、Why Flask & 概览
我负责项目web后端的用户模块,对并发量要求不高。考虑到Flask小巧简单易上手,同时具有强大的扩展能力,使其功能可以不弱于django、Tornado等框架,我最终选择了Flask。下面是Flask最简单的一个示例,这篇文章要做的就是将其充实、扩展、拆分,使代码具有良好的可扩展性和可读性。
from flask import Flask
app = Flask(__name__)
@app.route('api/test')
def hello():
return 'Hello World!'
if __name__ == '__main__':
app.run()
本文假设你已有基础的python语法知识。装饰器是一种代码运行期间动态增加功能的方式,本质上是一个返回函数的高阶函数,也可以简单的将其理解为一个函数的包装函数。上述代码中的route方法是一个装饰器,这个装饰器的作用就是将地址(api/test)与方法名hello联系起来,当HTTP请求的url为(api/test)时候将调用hello方法进行处理。也就是建立了url与处理函数的映射。深入了解可以查看这篇文章。
看起来不复杂,那就让我们继续吧!先从环境工具配置开始:
常用工具
1.IDE
jetbrains家的pycharm,自带终端(虚拟环境、安装插件、启动redis等操作)、Python Console运行python、Version Control版本控制、Even Log打印。
pycharm.png
2.请求工具
火狐浏览器插件—HTTP requester。可以自定义请求方式 request methods、请求内容request body、请求头 request header等,当你写好一个接口时,可以非常方便得进行测试。
httprequester.png
项目配置
1.虚拟环境
可以按官方文档使用终端进行配置,也可以在pycharm的偏好设置里进行设置,这里我们使用python3.5的解释器。安装后执行命令进入虚拟环境,其中yourvenv为你指定创建的虚拟环境目录
$ source yourvenv/bin/activate
2.使用pip进行包管理
pip是python的包管理工具,如果你是通过homebrew安装python则会自动安装pip。其他情况参考stackoverflow。安装好pip之后,在虚拟环境中通过
$ pip install flask(库名)
安装Flask以及其他三方库。
3.配置redis
Reids是现在最流行的的非关系型数据库(key-value)。其数据缓存在内存中,因此效率很高。多用于存储临时的、高度动态的数据。在用户模块中我们将会对验证码进行redis存储(短时间内进行写入读取操作,并且在缓存一定时间后删除)。本文中将会已用户注册时生成的邀请码为例,进行redis存取操作。
从Redis官网下载安装包并按文档安装后,终端执行
$ redis-server
启动redis,在项目中pip安装即可调用其API。
4.项目相关约定
项目采用前后端分离的方式,只进行数据交互,不使用python的jinja2模板去渲染页面给web前端
web前端、iOS、Android与后端数据交互的格式均为json
前端的请求头默认带terminal(前端类型)、version(版本号),后端返回的数据中包含“code”、“msg”参数,code=0表示请求处理成功,当code!=0时,msg为错误信息
<