pythonpecanapi开发_python学习之pecan框架Pecan框架
基础知识介绍:
⼀. ⽂件中需要包含⼀个config.py⽂件,该⽂件⽤于标注pecan程序的起点等配置信息:
app = {
'root': 'RootController',
'modules': ['webdemo.api'],
'debug': True,
}
modules:其中包含的python包,是app.py⽂件所在的包,即setup_app⽅法所在的包
root:即RootController所在的路径,/路径
debug:是否开启调试,⽣产环境的话,将其置为False
当RootController继承st.RestController时,存在URL映射关系如下表所⽰,当然也可以另外⾃⼰定义新的⽅式: Method
Description
Example Method(s) / URL(s)
get_one
Display one record.
GET /books/1
get_all
Display all records in a resource.
GET /books/
get
A combo of get_one and get_all.
GET /books/ 或 GET /books/1
new
柔性触觉传感器Display a page to create a new resource.
GET /books/new
edit
Display a page to edit an existing resource.
GET /books/1/edit
post
Create a new record.
POST /books/
put
Update an existing record.
POST /books/1?_method=put 或 PUT /books/1
get_delete
Display a delete confirmation page.
GET /books/1/delete
delete
Delete an existing record.
POST /books/1?_method=delete 或 DELETE /books/1
在RootController类中,⼀般会写上如下的代码:
from pecan import rest
import pecan
class RootController(rest.RestController):
@pose()
def get(self):
return 'This is RootController GET.'
当存在以上代码时,使⽤以下命令调⽤就会有返回值:
返回值为:
This is RootController GET.
也就是说,curl中的GET对应了代码中的get()⽅法,若要增加POST⽅法,可以在代码中添加如下:
@pose()
def post(self):
return 'This is RootController POST.'
当然,如果有的⽅法,需要既可以使⽤GET,⼜可以使⽤POST,且对不同的⽅法有不同的回应,则可以写成如下:from pecan import rest
import pecan
class RootController(rest.RestController):
_custom_actions = {
'test': ['GET', 'POST'],
}
@pose()
def test(self):
hod == 'POST':
return 'This is RootController test POST.'
hod == 'GET':
return 'This is RootController test GET.'
语音播放模块可以使⽤如下命令进⾏请求:
==下⾯重点介绍对象分发式路由:==
当存在以下代码的时候:
class v1Controller(rest.RestController):
@pose()
def get(self):
return 'This is v1Controller GET.'
class RootController(rest.RestController):
v1 = v1Controller()
在RootController类中,⽣成了⼀个v1Controller对象,这个对象就是⽤来做分发式路由的,因此可以使⽤如下命令去调⽤它:三. 使⽤WSME来规范API的响应值
wsme模块可以⽤来规范API的请求和响应值,并且可以和pecan模块很好的结合在⼀起,其⽀持的类型如下:
Type
Json type
str
String
unicode
String
int
Number
float
Number
bool
Boolean
Decimal
String
date
String (YYYY-MM-DD)
time
String (hh:mm:ss)
datetime
String (YYYY-MM-DDThh:mm:ss)
Arrays
Array
None
null
Complex types
Object
在下⾯这个例⼦中,可以看出:
u盾客户端from wsmeext.pecan import wsexpose
from pecan import rest
class RootController(rest.RestController):
水幕除尘
@wsexpose(int, int)
def get_one(self, arg):
return 1
@wsexpose(int, int)中第⼀个int表⽰返回值必须为int,第⼆个int表⽰请求参数必须为int
在这个例⼦中,可以使⽤curl去测试:
# 返回消息如下:
1
若⽤以下的输⼊,则会错误:
# 返回消息如下:
{"debuginfo": null, "faultcode": "Client", "faultstring": "Invalid input for field/attribute arg. Value: 'xxx'. unable to convert to int. Error: invalid literal for int() with base 10: 'xxx'"}
当然,wsme还可以⽤来检测更为复杂的类型,如类对象,这个在下⾯再做介绍。
四. wsme检测类对象:
在openstack中,使⽤Rest API返回的响应值经常会是以下格式:
{"users":[{"name":"Alice","age":30},{"name":"Bob","age":40}]}
针对于这种情况,我们可以使⽤WSME的⾃定义类型,下⾯就定义⼀个user类型和users类型:
from wsme import types as wtypes
class User(wtypes.Base):
name =
age = int
class Users(wtypes.Base):
users = [User]
注意: 这⾥没有使⽤__init__是因为,⽗类的初始化⽅法参数为**kw,因此没有特殊需求,这⾥可以不写
现在可以使⽤如下的⽅法去调⽤这两个类型:
from wsmeext.pecan import wsexpose
from pecan import rest
class RootController(rest.RestController):
@wsexpose(User, int)# 返回值为User类对象
def get_one(self, id):
if id == 1:
user_info = {
'name': 'yangsijie',
'age': 23
}
return User(**user_info)
# 或者也可以使⽤下⾯这种⽅式:
# if id == 1:
# return User(name='yangsijie', age=23)
@wsexpose(Users)# 返回值为Users类对象
def get_all(self):
user_info_list = [单宁酶
{
'name': 'yangsijie',
'age': 23
},
{
'name': 'panna',
'age': 23
}
]
users_list = [User(**user_info) for user_info in user_info_list]
return Users(users=users_list)
# 或者也可以使⽤下⾯这种⽅式:
# return Users(users=[User(name='yangsijie', age=23), User(name='panna', age=23)])现在使⽤curl命令会出现以下现象:
# 返回值为:
{"age": 23, "name": "yangsijie"}
>kv7