突发奇想,想要使用python Flask去实现restful api service,这算是一种学习,也可以是一种目标,下面为大家整理的是具体的使用步骤,感兴趣的一起来了解下。
用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/
几点疑问:
-
正则(.*)理论上应该是匹配任何除回车的所有字符,但不知道为什么,在这里不识别问号(?)
我用request.data来取表单数据,为何request.form取不到?
"/rs/
解析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/", 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
【python zip】python Flask实现restful api service解析
http://m.bbyears.com/jiaocheng/141511.html
推荐访问:python基础教程 python3