python 为 mysql 实现 restful 接口的详细步骤代码

最近在做游戏服务分层的时候,一直想把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

参考链接: http://flask-restless.readthedocs.org/en/latest/

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

# -*- coding: utf-8 -*-

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版自带了一个可视化的操作页面,如下:

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

from rest_framework import serializers
from models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

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 即可看到如下界面了:

对应的测试代码如下:

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 不一样,需要注意。

OK,就这样。

时间: 2024-08-01 05:29:42

python 为 mysql 实现 restful 接口的详细步骤代码的相关文章

在Python的框架中为MySQL实现restful接口的教程_python

最近在做游戏服务分层的时候,一直想把mysql的访问独立成一个单独的服务DBGate,原因如下:     请求收拢到DBGate,可以使DBGate变为无状态的,方便横向扩展     当请求量或者存储量变大时,mysql需要做分库分表,DBGate可以内部直接处理,外界无感知     通过restful限制对数据请求的形式,仅支持简单的get/post/patch/put 进行增删改查,并不支持复杂查询.这个也是和游戏业务的特性有关,如果网站等需要复杂查询的业务,对此并不适合     DBGat

python操作mysql数据库实现增删改查

Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: GadFly mSQL MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase 你可以访问Python数据库接口及API查看详细的支持数据库列表. 不同的数据库你需要下载不同的DB API模块,例如你需要

Python操作MYSQL数据库

一.安装MySQLdb     MySQLdb is an interface to the popular MySQL database server for Python. The design goals are         1. Compliance with Python database API version 2.0(兼容python 数据库API2.0接口)         2. Thread-safety(线程安全)         3. Thread-friendline

PHP编写RESTful接口_php实例

首先我们来认识下RESTful Restful是一种设计风格而不是标准,比如一个接口原本是这样的: http://www.test.com/user/view/id/1 表示获取id为1的用户信息,如果使用Restful风格,可以变成这样: http://www.test.com/user/1 可以很明显的看出这样做的好处: 1.更简洁的URL,对程序员友好 2.不暴露内部代码结构,更安全 那么,如何实现这个接口呢?首先,我们需要接收到/user/1部分. $path = $_SERVER['P

PHP编写RESTful接口的方法_php实例

这是一个轻量级框架,专为快速开发RESTful接口而设计.如果你和我一样,厌倦了使用传统的MVC框架编写微服务或者前后端分离的API接口,受不了为了一个简单接口而做的很多多余的coding(和CTRL-C/CTRL-V),那么,你肯定会喜欢这个框架! 先举个栗子1.写个HelloWorld.php,放到框架指定的目录下(默认是和index.php同级的apis/目录) /** * @path("/hw") */ class HelloWorld { /** * @route({&quo

Python操作Mysql实例代码教程(1/3)

本文介绍了Python操作MYSQL.执行SQL语句.获取结果集.遍历结果集.取得某个字段.获取表字段名.将图片插入数据库.执行事务等各种代码实例和详细介绍,代码居多,是一桌丰盛唯美的代码大餐. 实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发,请见我的另一篇文章:  代码如下 复制代码 # -*- coding: UTF-8 -*- #安装MYSQL DB for python import MySQLdb as mdb con = None try:

Python连接mysql数据库

 首先你要做的还是下载相应的模块并且安装啦,下载地址自己搜,网上有很多,安装的话也很好办,安装之后python的安装目录下的Lib文件夹下的site-packages文件夹下的MySQLdb文件夹,这之中存放的便是该模块的定义.准备工作做好之后我们需要在源码中import MySQLdb 数据库的连接: 模块引入之后我们就需要和数据库进行连接了,实例代码如下: db = MySQLdb.connect("localhost","root","123456&

python连接MySQL数据库实例分析

  本文实例讲述了python连接MySQL数据库的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 import MySQLdb conn = MySQLdb.connect(host="localhost", user="root", passwd="123456", db="test") cursor = conn.cursor() cursor.execute(&

python和mysql连接数据库的问题

问题描述 python和mysql连接数据库的问题 import mysql.connector cnx = mysql.connector.connect(user='scott', password='tiger',host='127.0.0.1',database='employees') cnx.close() 方法二: import MySQLdb db = MySQLdb.connect(host="localhost", # your host, usually loca