用PyRestful快速构建Tornado下REST APIs 的支持
一、安装PyRestful库
$ pip install pyrestful
二、使用案例
(一)books_service.py
# -*- coding: utf-8 -*- import tornado.ioloop
import pyrestful.rest from pyrestful import mediatypes
from pyrestful.rest import get, post, put, delete class Book(object):
isbn = int
title = str class BookResource(pyrestful.rest.RestHandler):
@get(_path="/books/json/{isbn}", _types=[int], _produces=mediatypes.APPLICATION_JSON)
def getBookJSON(self, isbn):
book = Book()
book.isbn = isbn
book.title = "My book for isbn "+str(isbn) return book @get(_path="/books/xml/{isbn}", _types=[int], _produces=mediatypes.APPLICATION_XML)
def getBookXML(self, isbn):
book = Book()
book.isbn = isbn
book.title = "My book for isbn "+str(isbn) return book @post(_path="/books/xml",_types=[Book],_consumes=mediatypes.APPLICATION_XML, _produces=mediatypes.APPLICATION_XML)
def postBookXML(self, book):
""" this is an echo...returns the same xml document """
return book @post(_path="/books/json",_types=[Book],_consumes=mediatypes.APPLICATION_JSON, _produces=mediatypes.APPLICATION_JSON)
def postBookJSON(self, book):
""" this is an echo...returns the same json document """
return book @post(_path="/books",_types=[Book])
def postBook(self, book):
""" this is an echo, returns json or xml depending of request content-type """
return book if __name__ == '__main__':
try:
print("Start the service")
app = pyrestful.rest.RestService([BookResource])
app.listen(8080)
tornado.ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
print("\nStop the service")
(二)create_customer.py
# -*- coding: utf-8 -*- import json
import sys if sys.version_info > (3,):
raw_input = input
import http.client as httplib
import urllib.parse as urllib
else:
import httplib
import urllib print('Create customer')
print('===============')
name_customer = raw_input('Customer Name : ')
address_customer = raw_input('Customer Address : ') if len(name_customer) == 0 and len(address_customer) == 0:
print('You must indicates name and address of customer')
else:
params = urllib.urlencode({'name_customer':name_customer,'address_customer':address_customer})
headers = {"Content-Type": "application/x-www-form-urlencoded"}
conn = httplib.HTTPConnection("localhost:8080") conn.request('POST','/customer',params,headers) resp = conn.getresponse()
data = resp.read()
if resp.status == 200:
json_data = json.loads(data.decode('utf-8'))
print(json_data)
else:
print(data)
(三)customer_service.py
# -*- coding: utf-8 -*- import tornado.ioloop
import pyrestful.rest from pyrestful import mediatypes
from pyrestful.rest import get, post, put, delete class Customer(object):
id_customer = int
name_customer = str
address_customer = str
def __init__(self,id_customer=0, name_customer=None, address_customer=None):
self.id_customer = id_customer
self.name_customer = name_customer
self.address_customer = address_customer
# Setters
def setId_Customer(self,id_customer):
self.id_customer = id_customer
def setName_Customer(self,name_customer):
self.name_customer = name_customer
def setAddress_Customer(self,address_customer):
self.address_customer = address_customer
# Getters
def getId_Customer(self):
return self.id_customer
def getName_Customer(self):
return self.name_customer
def getAddress_Customer(self):
return self.address_customer class CustomerDataBase(object):
customerDB = dict()
id_seq = 1 def insert(self, name_customer, address_customer):
sequence = self.id_seq
customer = Customer(sequence, str(name_customer), str(address_customer))
self.customerDB[sequence] = customer
self.id_seq += 1 return sequence def update(self,id_customer, name_customer, address_customer):
if self.exists(id_customer):
customer = self.customerDB[id_customer]
customer.setName_Customer(str(name_customer))
customer.setAddress_Customer(str(address_customer))
self.customerDB[id_customer] = customer
return True
else:
return False def delete(self,id_customer):
if self.exists(id_customer):
del self.customerDB[id_customer]
return True
else:
return False def find(self,id_customer):
if self.exists(id_customer):
return self.customerDB[id_customer]
else:
return None def exists(self,id_customer):
if id_customer in self.customerDB:
return True
else:
return False def all(self):
return self.customerDB class CustomerResource(pyrestful.rest.RestHandler):
def initialize(self, database):
self.database = database @get(_path="/customer", _produces=mediatypes.APPLICATION_JSON)
def getListCustomer(self):
customers = self.database.all() response = dict()
for k in customers.keys():
cust = dict()
cust['id_customer'] = customers[k].getId_Customer()
cust['name_customer'] = customers[k].getName_Customer()
cust['address_customer'] = customers[k].getAddress_Customer()
response[k] = { k : cust } return response @get(_path="/customer/{id_customer}", _types=[int], _produces=mediatypes.APPLICATION_JSON)
def getCustomer(self, id_customer):
if not self.database.exists(id_customer):
self.gen_http_error(404,"Error 404 : do not exists the customer : %d"%id_customer)
return customer = self.database.find(id_customer) response = dict()
response['id_customer'] = customer.getId_Customer()
response['name_customer'] = customer.getName_Customer()
response['address_customer'] = customer.getAddress_Customer()
print(response)
return response @post(_path="/customer", _types=[str,str], _produces=mediatypes.APPLICATION_JSON)
def createCustomer(self, name_customer, address_customer):
id_customer = self.database.insert(name_customer, address_customer) return {"created_customer_id": id_customer} @put(_path="/customer/{id_customer}", _types=[int,str,str], _produces=mediatypes.APPLICATION_JSON)
def updateCustomer(self, id_customer, name_customer, address_customer):
if not self.database.exists(id_customer):
self.gen_http_error(404,"Error 404 : do not exists the customer : %d"%id_customer)
return updated = self.database.update(id_customer,name_customer,address_customer) return {"updated_customer_id": id_customer, "success":updated} @delete(_path="/customer/{id_customer}", _types=[int], _produces=mediatypes.APPLICATION_JSON)
def deleteCustomer(self,id_customer):
if not self.database.exists(id_customer):
self.gen_http_error(404,"Error 404 : do not exists the customer : %d"%id_customer)
return deleted = self.database.delete(id_customer) return {"delete_customer_id": id_customer, "success":deleted} if __name__ == '__main__':
try:
print("Start the service")
database = CustomerDataBase()
app = pyrestful.rest.RestService([CustomerResource], dict(database=database))
app.listen(8080)
tornado.ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
print("\nStop the service")
(四)delete_customer.py
# -*- coding: utf-8 -*- import json
import sys if sys.version_info > (3,):
raw_input = input
import http.client as httplib
import urllib.parse as urllib
else:
import httplib
import urllib print('Delete customer')
print('===============')
id_customer = raw_input('Id Customer : ') if len(id_customer) == 0:
print('You must indicates id of customer')
else:
conn = httplib.HTTPConnection("localhost:8080") conn.request('DELETE','/customer/%s'%id_customer) resp = conn.getresponse()
data = resp.read()
if resp.status == 200:
json_data = json.loads(data.decode('utf-8'))
print(json_data)
else:
print(data.decode('utf-8'))
(五)echo_service.py
import tornado.ioloop
import pyrestful.rest from pyrestful import mediatypes
from pyrestful.rest import get class EchoService(pyrestful.rest.RestHandler):
@get(_path="/echo/{name}", _produces=mediatypes.APPLICATION_JSON)
def sayHello(self, name):
return {"Hello":name} if __name__ == '__main__':
try:
print("Start the echo service")
app = pyrestful.rest.RestService([EchoService])
app.listen(8080)
tornado.ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
print("\nStop the echo service")
(六)update_customer.py
# -*- coding: utf-8 -*- import sys
import json if sys.version_info > (3,):
raw_input = input
import http.client as httplib
import urllib.parse as urllib
else:
import httplib
import urllib print('Update customer')
print('===============')
id_customer = raw_input('Id Customer : ')
name_customer = raw_input('Customer Name : ')
address_customer = raw_input('Customer Address : ') if len(id_customer) == 0 and len(name_customer) == 0 and len(address_customer) == 0:
print('You must indicates id, name and address of customer')
else:
params = urllib.urlencode({'name_customer':str(name_customer),'address_customer':str(address_customer)})
headers = {"Content-type": "application/x-www-form-urlencoded"}
conn = httplib.HTTPConnection("localhost:8080") conn.request('PUT','/customer/%s'%id_customer,params,headers) resp = conn.getresponse()
data = resp.read()
if resp.status == 200:
json_data = json.loads(data.decode('utf-8'))
print(json_data)
else:
print(data.decode('utf-8'))
用PyRestful快速构建Tornado下REST APIs 的支持的更多相关文章
- 使用 Vagrant + VirtualBox 快速构建 CentOS 下的 Docker 环境
Vagrant - 基础概念: Vagrant 是什么? Vagrant是一款用于在单个工作流程中构建和管理虚拟机环境的工具.凭借易于使用的工作流程和专注于自动化,Vagrant降低了开发环境设置时间 ...
- Hexo快速构建个人小站-Fulid主题下添加Valine评论系统(三)
Hexo目录: Hexo快速构建个人小站-Hexo初始化和将项目托管在Github(一) Hexo快速构建个人小站-自定义域名和自定义主题(二) 背景交代: 前面两章完成了Hexo的初始化和部分自定义 ...
- 快速构建springmvc+spring+swagger2环境
快速构建springmvc+spring+swagger2环境 开发工具:Intellij idea jdk: 1.8 开发步骤: 1.创建maven工程,如图建立工程结构 ...
- 玩转Windows服务系列——使用Boost.Application快速构建Windows服务
玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...
- 使用 Spring Boot 快速构建 Spring 框架应用--转
原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...
- Apache Commons CLI官方文档翻译 —— 快速构建命令行启动模式
昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册. 下面将会通过几个部分简单的介绍CLI在应用中的使用场景. 昨天已经联系过几个基本的命令行参数 ...
- C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面
个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...
- Java Swing快速构建窗体应用程序
以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
随机推荐
- linux下查看文件内容cat,more,less
1. 查看文件内容经常使用的命令 cat : 由第一行显示文件内容 tac: 从最后一行開始显示.与cat相反 nl : 文件内容和行号一起输出 more: 一页一页显示 less: 与more类 ...
- elmah - Error Logging Modules and Handlers for ASP.NET - 1 : 初体验
elmah(英文):https://code.google.com/p/elmah/ 写作思路:先看结果,然后再说原理 elmah文章基本内容如下 1.安装 2.基本使用 3.详细配置讲解 ...
- malloc 申请得到的内存后,再 free 释放它的时候,操作系统会立即收回那块内存吗?
stackoverflow上的回答: In many malloc/free implementations, free does normally not return the memory to ...
- C++_基础_类和对象3
内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...
- zoj3229
题目大意: 一个XX用n天要给m个女神拍写真.这n天里每个女神i分别至少要拍Gi张照片,XX在第j天会给指定Cj个女神最多拍Dj张照片,每个女神第j天拍照数在lj到hj张照片.问XX是否安排完成他的任 ...
- 插入数据,返回最新id
最简单的方法就是在查询之后select @@indentity. sql代码: INSERT INTO table_name (.....) VALUES(......) SELECT @@IDEN ...
- CPUから広がり
处理技术: 超标量是通过内置多条流水线来同时执行多个处理器,其实质是以空间换取时间.而超流水线是通过细化流水.提高主频,使得在一个机器周期内完成一个甚至多个操作,其实质是以时间换取空间. スター: 真 ...
- CSS 与 HTML5 响应式图片
什么是响应式图片? 响应式图片是指:用户代理根据输出设备的分辨率不同加载不同类型的图片,不会造成带宽的浪费.同时,在改变输出设备类型或分辨率时,能及时加载对应类型的图片. CSS3 响应式图片 对于很 ...
- codeforces 377B Preparing for the Contest 二分+优先队列
题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇 ...
- C语言迭代求解
date : 2013/8/12 desinger :pengxiaoen 今天看 国外电子信息科学经典教材系列 <电子电路分析与设计> 电子工业出版社的 的19 ...