用python写通用restful api service(二)
有志者,事竟成!如果你在学习数据库,那么本文《用python写通用restful api service(二)》,就很适合你!文章讲解的知识点主要包括MySQL、python、flask、rest-api,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~
今天项目已经能够做一个简单的后端服务了,在mysql中新建一个表,就能自动提供restful api的CURD服务了。
关键点
- 根据REST的四种动词形式,动态调用相应的CURD方法;
- 编写REST与基础数据库访问类之间的中间层(baseDao),实现从REST到数据访问接口之间能用业务逻辑处理;
- 编写基础数据库访问类(dehelper),实现从字典形式的参数向SQL语句的转换;
实现的rest-api
实现了如下形式的rest-api
[GET]/rs/users/{id}
[GET]/rs/users/key1/value1/key2/value2/.../keyn/valuen
[POST]/rs/users
[PUT]/rs/users/{id}
[DELETE]/rs/users/{id}
基础数据库访问类
该类实现与pymysql库的对接,提供标准CURD接口。
准备数据库表
在数据库对应建立users表,脚本如下:
CREATE TABLE `users` ( `_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '标题名称', `phone` varchar(1024) DEFAULT '', `address` varchar(1024) DEFAULT NULL, `status` tinyint(4) DEFAULT '1' COMMENT '状态:0-禁;1-有效;9删除', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`_id`), UNIQUE KEY `uuid` (`_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='表';
新建数据库配置文件(configs.json)
数据连接配置,不入版本库。
{
"db_config": {
"db_host": "ip",
"db_port": 1234,
"db_username": "root",
"db_password": "******",
"db_database": "name",
"db_charset": "utf8mb4"
}
}
对接pymysql接口
用函数exec_sql封装pymysql,提供统一访问mysql的接口。is_query函数用来区分是查询(R)还是执行(CUD)操作。出错处理折腾了好久,插入异常返回的错误形式与其它的竟然不一样!返回参数是一个三元组(执行是否成功,查询结果或错误对象,查询结果数或受影响的行数)
with open("./configs.json", 'r', encoding='utf-8') as json_file:
dbconf = json.load(json_file)['db_config']
def exec_sql(sql, values, is_query=False):
try:
flag = False #是否有异常
error = {} #若异常,保存错误信息
conn = pymysql.connect(host=dbconf['db_host'], port=dbconf['db_port'], user=dbconf['db_username'],
passwd=dbconf['db_password'], db=dbconf['db_database'], charset=dbconf['db_charset'])
with conn.cursor(pymysql.cursors.DictCursor) as cursor:
num = cursor.execute(sql, values) #查询结果集数量或执行影响行数
if is_query: #查询取所有结果
result = cursor.fetchall()
else: #执行提交
conn.commit()
print('Sql: ', sql, ' Values: ', values)
except Exception as err:
flag = True
error = err
print('Error: ', err)
finally:
conn.close()
if flag:
return False, error, num if 'num' in dir() else 0
return True, result if 'result' in dir() else '', num
查询接口
pymysql的查询接口,可以接受数组,元组和字典,本查询接口使用数组形式来调用。现在此接口只支持与条件组合参数。
def select(tablename, params={}, fields=[]):
sql = "select %s from %s " % ('*' if len(fields) == 0 else ','.join(fields), tablename)
ks = params.keys()
where = ""
ps = []
pvs = []
if len(ks) > 0: #存在查询条件时,以与方式组合
for al in ks:
ps.append(al + " =%s ")
pvs.append(params[al])
where += ' where ' + ' and '.join(ps)
rs = exec_sql(sql+where, pvs, True)
print('Result: ', rs)
if rs[0]:
return {"code": 200, "rows": rs[1], "total": rs[2]}
else:
return {"code": rs[1].args[0], "error": rs[1].args[1], "total": rs[2]}
插入接口
以数组形式提供参数,错误信息解析与其它接口不同。
def insert(tablename, params={}):
sql = "insert into %s " % tablename
ks = params.keys()
sql += "(`" + "`,`".join(ks) + "`)" #字段组合
vs = list(params.values()) #值组合,由元组转换为数组
sql += " values (%s)" % ','.join(['%s']*len(vs)) #配置相应的占位符
rs = exec_sql(sql, vs)
if rs[0]:
return {"code": 200, "info": "create success.", "total": rs[2]}
else:
return {"code": 204, "error": rs[1].args[0], "total": rs[2]}
修改接口
以字典形式提供参数,占位符的形式为:%(keyname)s,只支持按主键进行修改。
def update(tablename, params={}):
sql = "update %s set " % tablename
ks = params.keys()
for al in ks: #字段与占位符拼接
sql += "`" + al + "` = %(" + al + ")s,"
sql = sql[:-1] #去掉最后一个逗号
sql += " where _id = %(_id)s " #只支持按主键进行修改
rs = exec_sql(sql, params) #提供字典参数
if rs[0]:
return {"code": 200, "info": "update success.", "total": rs[2]}
else:
return {"code": rs[1].args[0], "error": rs[1].args[1], "total": rs[2]}
删除接口
以字典形式提供参数,占位符的形式为:%(keyname)s,只支持按主键进行删除。
def delete(tablename, params={}):
sql = "delete from %s " % tablename
sql += " where _id = %(_id)s "
rs = exec_sql(sql, params)
if rs[0]:
return {"code": 200, "info": "delete success.", "total": rs[2]}
else:
return {"code": rs[1].args[0], "error": rs[1].args[1], "total": rs[2]}
中间层(baseDao)
提供默认的操作数据库接口,实现基础的业务逻辑,单表的CURD有它就足够了。有复杂业务逻辑时,继承它,进行扩展就可以了。
import dbhelper
class BaseDao(object):
def __init__(self, table):
self.table = table
def retrieve(self, params={}, fields=[], session={}):
return dbhelper.select(self.table, params)
def create(self, params={}, fields=[], session={}):
if '_id' in params and len(params)
动态调用CURD
根据客户调用的rest方式不同,动态调用baseDao的相应方法,这个很关键,实现了它才能自动分配方法调用,才能只需要建立一个数据表,就自动提供CURD基本访问功能。还好,动态语言能很方便的实现这种功能,感慨一下,node.js更方便且符合习惯^_^
method = {
"GET": "retrieve",
"POST": "create",
"PUT": "update",
"DELETE": "delete"
}
getattr(BaseDao(table), method[request.method])(params, [], {})
说明:
- table是前一章中解析出来的数据表名,这块就是users;
- method应该是定义一个常量对象,对应rest的动词,因为对ypthon不熟,定义了一个变量先用着,查了下常量说明,看着好复杂;
- request.method 客户请求的实际rest动词;
- params是前一章中解析出来的参数对象;
完整代码
git clone https://github.com/zhoutk/pyrest cd pyrest export FLASK_APP=index.py flask run
小结
至此,我们已经实现了基本的框架功能,以后就是丰富它的羽翼。比如:session、文件上传、跨域、路由改进(支持无缝切换操作数据库的基类与子类)、参数验证、基础查询功能增强(分页、排序、模糊匹配等)。
感慨一下,好怀念在node.js中json对象的写法,不用在key外加引号。
补丁
刚把基础数据库访问类中的insert方法的参数形式改成了字典,结果异常信息也正常了,文章不再改动,有兴趣者请自行查阅源代码。
今天关于《用python写通用restful api service(二)》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
Ubuntu的web服务器搭建系列之MySQL(JDK+Tomcat+MySQL+Nginx+Redis+NodeJS)
- 上一篇
- Ubuntu的web服务器搭建系列之MySQL(JDK+Tomcat+MySQL+Nginx+Redis+NodeJS)
- 下一篇
- Centos7 上安装mysql遇上的问题:mysql无法正常启动
-
- 数据库 · MySQL | 1天前 |
- MySQL数值函数大全及使用技巧
- 117浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 三种登录MySQL方法详解
- 411浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 420浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 264浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL索引的作用是什么?
- 266浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL排序原理与实战应用
- 392浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQLwhere条件查询技巧
- 333浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用数据类型有哪些?怎么选更合适?
- 234浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用命令大全管理员必学30条
- 448浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL高效批量插入数据方法大全
- 416浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL性能优化技巧大全
- 225浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL数据备份4种方法保障安全
- 145浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3167次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3380次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3409次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4513次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3789次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览

