用python写通用restful api service(一)
一直在用node.js做后端,要逐步涉猎大数据范围,注定绕不过python,因此决定把一些成熟的东西用python来重写,一是开拓思路、通过比较来深入学习python;二是有目标,有动力,希望能持之以恒的坚持下去。
项目介绍
用python语言来写一个restful api service,数据库使用mysql。因为只做后端微服务,并且ORM的实现方式,采用自动生成SQL的方式来完成,因此选择了轻量级的flask作为web框架。如此选择,主要目的是针对中小规模的网络应用,能充分利用关系数据库的种种优势,来实现丰富的现代互联网应用。
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 = mapself.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 = alelif i == 1:idd = alelif i > 1 and i % 2 == 0:tmp = alelse:ps[tmp] = alps['table'] = tableif url_len > 1:ps['id'] = iddif 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 = psreturn jsonify(params)
pycharm项目配置
配置好Run/Debug Configurations才能在IDE中运行并单步调试,可以很熟悉flask框架的运行原理。
- Script path : /usr/local/bin/flask
- Parameters : run
环境变量
- FLASK_APP = index.py
- LC_ALL = en_US.utf-8
- LANG = en_US.utf-8
本以为配置完上面三条就能运行了,因为在终端模拟器上就已经能正常运行。结果在IDE中出现了一堆莫名的错误,仔细看,大概是编码配置的问题。经搜索,还需要配置后面两个环境变量才能正常运行,大概原因是python版本2与3之间的区别。
完整代码
git clone https://github.com/zhoutk/pyrest.git
cd pyrest
export FLASK_APP=index.py
flask run
小结
今天利用flask完成了web基础架构,能够正确解析URL,提取客户端提交的数据,按请求的不同方式来组合我们需要的数据。
用python写通用restful api service(一)相关推荐
- python实现简单的api接口-用python写一个restful API
# -*- coding: utf-8 -*- # 作者: 煮酒品茶 """ package.module ~~~~~~~~~~~~~~ python实现的图书的一个re ...
- python flask高级编程之restful_python Flask实现restful api service
一直在用node.js做后端,要逐步涉猎大数据范围,注定绕不过python,因此决定把一些成熟的东西用python来重写,一是开拓思路.通过比较来深入学习python:二是有目标,有动力,希望能持之以 ...
- python restful api_用Python语言写一个restful API
本文主要向大家介绍了用Python语言写一个restful API,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. """ package.modul ...
- Python自动化开发 - RESTful API
本节内容 1. RESTful 简介 2. RESTful 设计指南 3. Django REST Framework 最佳实践 4. 理论拓展与开放平台 5. API文档化与测试 一 R ...
- A Simple RESTful API Service With Node.js And Koa2
背景: 2017年可以说是区块链爆发的一年,都说币圈一日股市一年,小道消息的即时性很重要,自己有时候想要即时查询币价,同时也需要实时获知一些利好或利空消息,奈何总找不到合适自己的小玩意: 女朋友怕冷, ...
- web返回的数据集格式_SpringBoot RESTful API返回统一数据格式还不懂?
关于 Spring 的全局处理,我有两方面要说: 统一数据返回格式 统一异常处理 为了将两个问题说明清楚,将分两个章节分别说明,本章主要说第一点 有童鞋说,我们项目都做了这种处理,就是在每个 API ...
- 使用python的Flask实现一个RESTful API服务器端
使用python的Flask实现一个RESTful API服务器端[翻译] 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了 ...
- c++ python混合编程 restful_How to use Python to build a RESTful Web Service
由于知乎目前限制单人仅能开通单个专栏,所以关于文章主题的所有文字都会写在该单篇文章中(避免污染专栏),目前处于长篇连载且停滞状态,待续.. Github Repo: nekocode/tornaRES ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts ...
最新文章
- 6位有符号补码阵列乘法器_C/C++学习日记:原码、反码和补码
- Java程序员面试宝典--this
- NYOJ 150 Train Problem I STL栈
- 1.15.Flink state(状态)管理与恢复、什么是state、Keyed State、Operator State、状态容错(生成快照,恢复快照),checkPoint简介,重启策略等
- JMeter之JMS接口测试
- 最新.NET MAUI有什么惊喜?
- 前端学习(2674):vue3修改
- 语义分割中的类别不平衡的权重计算
- Jest中Mock网络请求
- java构造函数_Java开发人员也会犯的十大错误
- 关于Android 的内存泄露及分析
- pcb 理论阻值、 过孔_PCB设计中过孔常用的处理方式
- 电压负反馈放大电路(基于三极管)
- 企业级地理数据库(2)创建并加载企业级地理数据库
- 卡内基梅隆计算机专业排名,2019年卡内基梅隆大学计算机专业排名多少?
- 神棍节献礼之——URAL1111 Squares(几何)
- EXCEL数据有效性的多级联动
- 再见PDF提取收费!我用100行Python代码搞定!
- Error querying database. Cause: java.lang.NullPointerException .The error occurred while handlin
- bash shell:获取当前脚本的绝对路径(pwd/readlink)