python flask restful api 统计分析_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/', methods=['PUT', 'DELETE', 'POST', 'GET'])

几点疑问:

正则(.*)理论上应该是匹配任何除回车的所有字符,但不知道为什么,在这里不识别问号(?)

我用request.data来取表单数据,为何request.form取不到?

'/rs/'后若加个反斜杠('/rs//'),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/', 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,提取客户端提交的数据,按请求的不同方式来组合我们需要的数据。希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: python Flask实现restful api service

本文地址: http://www.cppcns.com/jiaoben/python/213028.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值