一直在用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'])

几点疑问:

  1. 正则(.*)理论上应该是匹配任何除回车的所有字符,但不知道为什么,在这里不识别问号(?)
  2. 我用request.data来取表单数据,为何request.form取不到?
  3. '/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(一)相关推荐

  1. python实现简单的api接口-用python写一个restful API

    # -*- coding: utf-8 -*- # 作者: 煮酒品茶 """ package.module ~~~~~~~~~~~~~~ python实现的图书的一个re ...

  2. python flask高级编程之restful_python Flask实现restful api service

    一直在用node.js做后端,要逐步涉猎大数据范围,注定绕不过python,因此决定把一些成熟的东西用python来重写,一是开拓思路.通过比较来深入学习python:二是有目标,有动力,希望能持之以 ...

  3. python restful api_用Python语言写一个restful API

    本文主要向大家介绍了用Python语言写一个restful API,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. """ package.modul ...

  4. Python自动化开发 - RESTful API

    本节内容 1.  RESTful 简介 2.  RESTful 设计指南 3.  Django REST Framework 最佳实践 4.  理论拓展与开放平台 5.  API文档化与测试 一  R ...

  5. A Simple RESTful API Service With Node.js And Koa2

    背景: 2017年可以说是区块链爆发的一年,都说币圈一日股市一年,小道消息的即时性很重要,自己有时候想要即时查询币价,同时也需要实时获知一些利好或利空消息,奈何总找不到合适自己的小玩意: 女朋友怕冷, ...

  6. web返回的数据集格式_SpringBoot RESTful API返回统一数据格式还不懂?

    关于 Spring 的全局处理,我有两方面要说: 统一数据返回格式 统一异常处理 为了将两个问题说明清楚,将分两个章节分别说明,本章主要说第一点 有童鞋说,我们项目都做了这种处理,就是在每个 API ...

  7. 使用python的Flask实现一个RESTful API服务器端

    使用python的Flask实现一个RESTful API服务器端[翻译] 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了 ...

  8. c++ python混合编程 restful_How to use Python to build a RESTful Web Service

    由于知乎目前限制单人仅能开通单个专栏,所以关于文章主题的所有文字都会写在该单篇文章中(避免污染专栏),目前处于长篇连载且停滞状态,待续.. Github Repo: nekocode/tornaRES ...

  9. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts ...

最新文章

  1. 6位有符号补码阵列乘法器_C/C++学习日记:原码、反码和补码
  2. Java程序员面试宝典--this
  3. NYOJ 150 Train Problem I STL栈
  4. 1.15.Flink state(状态)管理与恢复、什么是state、Keyed State、Operator State、状态容错(生成快照,恢复快照),checkPoint简介,重启策略等
  5. JMeter之JMS接口测试
  6. 最新.NET MAUI有什么惊喜?
  7. 前端学习(2674):vue3修改
  8. 语义分割中的类别不平衡的权重计算
  9. Jest中Mock网络请求
  10. java构造函数_Java开发人员也会犯的十大错误
  11. 关于Android 的内存泄露及分析
  12. pcb 理论阻值、 过孔_PCB设计中过孔常用的处理方式
  13. 电压负反馈放大电路(基于三极管)
  14. 企业级地理数据库(2)创建并加载企业级地理数据库
  15. 卡内基梅隆计算机专业排名,2019年卡内基梅隆大学计算机专业排名多少?
  16. 神棍节献礼之——URAL1111 Squares(几何)
  17. EXCEL数据有效性的多级联动
  18. 再见PDF提取收费!我用100行Python代码搞定!
  19. Error querying database. Cause: java.lang.NullPointerException .The error occurred while handlin
  20. bash shell:获取当前脚本的绝对路径(pwd/readlink)

热门文章

  1. jetty作为内嵌服务器自启动
  2. atitit.mp4 视频文件多媒体格式结构详解
  3. windows域设计best practice
  4. java最长类名_在java规范中类命名的字符长度是多少?
  5. js中的toString方法
  6. Linux防止SSH暴力破解
  7. 你确定你理解内存分配吗?
  8. 互联网和嵌入式哪个卷?
  9. JavaScript初学者编程题(11)
  10. 牛客练习赛32 -- Xor Path