python Flask 实现 restful api service
这里有新鲜出炉的 Python3 Cookbook 中文版, 程序狗速度看过来!
Python 编程语言
Python 是一种面向对象解释型计算机程序设计语言, 由 Guido van Rossum 于 1989 年底发明, 第一个公开发行版发行于 1991 年 Python 语法简洁而清晰, 具有丰富和强大的类库它常被昵称为胶水语言, 它能够把用其他语言制作的各种模块 (尤其是 C/C++) 很轻松地联结在一起
本篇文章主要介绍了 python Flask 实现 restful api service, 小编觉得挺不错的, 现在分享给大家, 也给大家做个参考一起跟随小编过来看看吧
一直在用 node.js 做后端, 要逐步涉猎大数据范围, 注定绕不过 python, 因此决定把一些成熟的东西用 python 来重写, 一是开拓思路通过比较来深入学习 python; 二是有目标, 有动力, 希望能持之以恒的坚持下去
项目介绍
用 python 语言来写一个 restful api service, 数据库使用 mysql 因为只做后端微服务, 并且 ORM 的实现方式, 采用自动生成 SQL 的方式来完成, 因此选择了轻量级的 flask 作为 web 框架如此选择, 主要目的是针对中小规模的网络应用, 能充分利用关系数据库的种种优势, 来实现丰富的现代互联网应用
REST 的六个特性:
Client-Server: 服务器端与客户端分离
Stateless(无状态): 每次客户端请求必需包含完整的信息, 换句话说, 每一次请求都是独立的
Cacheable(可缓存): 服务器端必需指定哪些请求是可以缓存的
Layered System(分层结构): 服务器端与客户端通讯必需标准化, 服务器的变更并不会影响客户端
Uniform Interface(统一接口): 客户端与服务器端的通讯方法必需是统一的
Code on demand(按需执行代码?): 服务器端可以在上下文中执行代码或者脚本
restful api
restful api 的概念就不介绍了这里说一下我们实现协议形式:
[GET]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen
[POST]/rs/user[/{id}]
[PUT]/rs/user/{id}
[DELETE]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen
说明:
rs 为资源标识;
第二节, user, 会被解析为数据库表名;
查询时, id 为空或 0 时, id 会被忽略, 即为列表查询;
新建和修改, 除接收 form 表单外, url 中的 id 参数也会被合并到参数集合中;
删除同查询
让 flask 支持正则表达式
flask 默认路由不支持正则表达式, 而我需要截取完整的 URL 自己来解析, 经查询, 按以下步骤很容易完成任务
使用 werkzeug 库 :from werkzeug.routing import BaseConverter
定义转换器:
class RegexConverter(BaseConverter):
def __init__(self, map, *args):
self.map = map
self.regex = args[0]
注册转换器 : app.url_map.converters['regex'] = RegexConverter
用正则来截取 url : @app.route('/rs/<regex(".*"):query_url>', methods=['PUT', 'DELETE', 'POST', 'GET'])
几点疑问:
正则 (.*) 理论上应该是匹配任何除回车的所有字符, 但不知道为什么, 在这里不识别问号(?)
我用 request.data 来取表单数据, 为何 request.form 取不到?
'/rs/<regex("."):query_url>'后若加个反斜杠('/rs/<regex("."):query_url>/'),request.data 就取不到数据, 为什么?
解析 json 数据
解析 json 数据很容易, 但我需要对客户端送上来的数据进行校验, 下面是用异常处理又只解析一次的解决方案
def check_json_format(raw_msg):
try:
js = json.loads(raw_msg, encoding='utf-8')
except ValueError:
return False, {}
return True, js
URL 解析
按既定协议解析 URL, 提取表名, 为生成 sql 组合参数集合
@app.route('/rs/<regex(".*"):query_url>', methods=['PUT', 'DELETE', 'POST', 'GET'])
def rs(query_url):
(flag, params) = check_json_format(request.data)
urls = query_url.split('/')
url_len = len(urls)
if url_len < 1 or url_len > 2 and url_len % 2 == 1:
return "The params is wrong."
ps = {}
for i, al in enumerate(urls):
if i == 0:
table = al
elif i == 1:
idd = al
elif i > 1 and i % 2 == 0:
tmp = al
else:
ps[tmp] = al
ps['table'] = table
if url_len > 1:
ps['id'] = idd
if request.method == 'POST' or request.method == 'PUT':
params = dict(params, **{'table': ps.get('table'), 'id': ps.get('id')})
if request.method == 'GET' or request.method == 'DELETE':
params = ps
return jsonify(params)
完整代码
git clone https://github.com/zhoutk/pyrest.git
cd rest
export FLASK_APP=index.py
flask run
小结
今天利用 flask 完成了 web 基础架构, 能够正确解析 URL, 提取客户端提交的数据, 按请求的不同方式来组合我们需要的数据希望对大家的学习有所帮助, 也希望大家多多支持 PHPERZ
来源: http://www.phperz.com/article/18/0131/361497.html