使用python为mysql实现restful接口


Posted in Python onJanuary 05, 2018

最近在做游戏服务分层的时候,一直想把mysql的访问独立成一个单独的服务DBGate,原因如下:

请求收拢到DBGate,可以使DBGate变为无状态的,方便横向扩展

当请求量或者存储量变大时,mysql需要做分库分表,DBGate可以内部直接处理,外界无感知

通过restful限制对数据请求的形式,仅支持简单的get/post/patch/put 进行增删改查,并不支持复杂查询。这个也是和游戏业务的特性有关,如果网站等需要复杂查询的业务,对此并不适合

DBGate使用多进程模式,方便控制与mysql之间的链接数,进行mysql访问量阀值保护

方便在DBGate上进行访问量统计,慢查询统计、权限控制等等一系列逻辑

目前是使用python,以后要使用其他语言进行mysql操作时,只要进行标准的http请求即可,不会出现不兼容的情况

当然坏处也是有的:

首当其冲就是单次请求的响应时间变长,毕竟中间加了一层服务,并且还是http格式

部署上比原来复杂了一些,很多对mysql直接操作的思维需要进行转变,一开始可能会有些不适

不过总的来说,还是利大于弊,所以最终还是决定搭建DBGate

当然,我们不可能去手工挨个写每个库表对应的restful服务,值得庆幸的是django和flask都提供了对应的解决方案,我们一个个介绍.

Flask

参考链接: flask-restless

flask-restless使用方法比较简单,我直接贴一下代码即可:

import datetime
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restless import APIManager
app = Flask(__name__)
db = SQLAlchemy(app)
restless = APIManager(app, flask_sqlalchemy_db=db)
class User(db.Model):
"""
user
"""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(255), unique=True, nullable=False)
password = db.Column(db.String(255), nullable=False)
create_time = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
login_time = db.Column(db.DateTime)
restless.create_api(User, methods=['GET', 'POST', 'DELETE', 'PATCH', 'PUT'], results_per_page=100)
db.create_all()
if __name__ == '__main__':
app.run(port=25000)

其对应的restful操作如下:

获取用户列表: GET /user

添加用户: POST /user

获取单个用户: GET /user/1

覆盖单个用户: PUT /user/1

修改单个用户: PATCH /user/1

注意:

在http请求中,记得加入header: Content-Type: application/json

flask-restless中,PUT和PATCH一样,都是传入什么字段,只修改什么字段,不会完全覆盖

Django

参考链接: Django REST framework

Django用起来要更复杂一些,也因为django版自带了一个可视化的操作页面,如下:

QQ20140803 2

1. 在settings中添加:

REST_FRAMEWORK = {
# Use hyperlinked styles by default.
# Only used if the `serializer_class` attribute is not set on a view.
'DEFAULT_MODEL _SERIALIZER_CLASS':
'rest_framework.serializers .HyperlinkedModelSerializer',
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT _PERMISSION_CLASSES': [
#'rest_framework.permissions .DjangoModelPermissionsOrAnonReadOnly',
'rest_framework .permissions.IsAdminUser',
]
}

2. 通过startapp建立一个app: demo

3. 修改demo的models:

class User(models.Model):
# key是保留字
password = models.IntegerField()
nick = models.CharField(max_length=255)
create_time = models.DateTimeField(default=datetime.datetime.now)

4. 在demo下新建serializers.py

class User(models.Model):
# key是保留字
password = models.IntegerField()
nick = models.CharField(max_length=255)
create_time = models.DateTimeField(default=datetime.datetime.now)

5. 在demo下修改views.py

from django.shortcuts import render
from rest_framework import viewsets
from serializers import UserSerializer
from models import User
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer

6. 在demo下新建urls.py

import os.path
from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.conf import settings
import views
from rest_framework import routers
appname = os.path.basename (os.path.dirname(os.path.abspath(__file__)))
router = routers.DefaultRouter()
router.register('users', views.UserViewSet, appname)
urlpatterns = patterns('',
url(r'^', include(router.urls)),
)

7. 在mysite.urls下include demo.urls和rest_framework.urls

urlpatterns = patterns('',
url(r'^demo/', include('demo.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
)

8. 执行初始化数据操作:

python manage.py syncdb

之后访问: http://127.0.0.1:8000/demo 即可看到如下界面了:

QQ20140803 1

对应的测试代码如下:

import json
import requests
from urlparse import urljoin
BASE_URL = 'http://127.0.0.1:16500/'
AUTH = ('admin', 'admin')
def test_get_user_list():
rsp = requests.get(urljoin(BASE_URL, '/demo/users/'), auth=AUTH, headers={
'Accept': 'application/json'
})
assert rsp.ok
def test_post_user_list():
json_data = dict(
password=0,
nick='oo',
create_time='2014-03-3T03:3:3'
)
rsp = requests.post(urljoin(BASE_URL, '/demo/users/'), auth=AUTH, headers={
'Accept': 'application/json',
'Content-Type': 'application/json',
}, data=json.dumps(json_data))
assert rsp.ok
def test_get_user():
rsp = requests.get(urljoin(BASE_URL, '/demo/users/1'), auth=AUTH, headers={
'Accept': 'application/json',
'Content-Type': 'application/json',
})
assert rsp.ok
def test_put_user():
json_data = dict(
password=100,
nick='xx',
create_time='2014-03-3T03:3:3'
)
# 注意最后的 /
rsp = requests.put(urljoin(BASE_URL, '/demo/users/1/'), auth=AUTH, headers={
'Accept': 'application/json',
'Content-Type': 'application/json',
}, data=json.dumps(json_data),
)
assert rsp.ok, rsp.status_code
def test_patch_user():
json_data = dict(
password=300,
)
rsp = requests.patch(urljoin(BASE_URL, '/demo/users/1/'), auth=AUTH, headers={
'Accept': 'application/json',
'Content-Type': 'application/json',
}, data=json.dumps(json_data),
)
assert rsp.ok, rsp.status_code

Django REST framework 是严格区分PUT和PATCH的,这一点和flask-restless 不一样,需要注意。

总结

以上所述是小编给大家介绍的使用python为mysql实现restful接口,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python+django快速实现文件上传
Oct 24 Python
Python实现针对中文排序的方法
May 09 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
基于python实现百度翻译功能
May 09 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 Python
Python hashlib模块实例使用详解
Dec 24 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
微信跳一跳python代码实现
Jan 05 #Python
python+opencv轮廓检测代码解析
Jan 05 #Python
python selenium UI自动化解决验证码的4种方法
Jan 05 #Python
轻松实现TensorFlow微信跳一跳的AI
Jan 05 #Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 #Python
django2 快速安装指南分享
Jan 05 #Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 #Python
You might like
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
优秀团员个人事迹材料
2014/01/29 职场文书
小学校园活动策划
2014/01/30 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
音乐节策划方案
2014/06/09 职场文书
城市创卫标语
2014/06/17 职场文书
十佳家长事迹材料
2014/08/26 职场文书
国庆节慰问信
2015/02/15 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技