from pecan import rest
import pecan
class RootController(rest.RestController):
_custom_actions = {
'test': ['GET', 'POST'],
}
@pecan.expose()
def test(self):
if pecan.request.method == 'POST':
return 'This is RootController test POST.'
elif pecan.request.method == 'GET':
return 'This is RootController test GET.'
可以使用如下命令进行请求:
curl -X GET http://127.0.0.1:8080/test
curl -X POST http://127.0.0.1:8080/test
==下面重点介绍对象分发式路由:==
当存在以下代码的时候:
class v1Controller(rest.RestController):
@pecan.expose()
def get(self):
return 'This is v1Controller GET.'
class RootController(rest.RestController):
v1 = v1Controller()
curl -X GET http://127.0.0.1:8081/xxx
# 返回消息如下:
{"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'"}
import wsmeext.pecan as wsme_pecan
def expose(*args, **kwargs):
if 'rest_content_types' not in kwargs:
kwargs['rest_content_types'] = ('json',)
return wsme_pecan.wsexpose(*args, **kwargs)
该函数用来让API返回JSON格式的数据
api/controllers/root.py:
from pecan import rest, expose
from wsme import types as wtypes
from webdemo2.api.controllers.v1 import controller as v1_controller
from webdemo2.api.expose import expose as wsexpose
class RootController(rest.RestController):
# All supported API versions
_versions = ['v1']
# The default API version
_default_version = 'v1'
v1 = v1_controller.V1Controller()
@wsexpose(wtypes.text)
def get(self):
return 'webdemo2'
@expose()
def _route(self, args, request=None):
"""When the API version is not specified in the url, v1 is used as the default version."""
if args[0] and args[0] not in self._versions:
args = [self._default_version] + args
return super(RootController, self)._route(args)
当URL中未指定版本号时,_route函数将版本号默认置为v1
api/controllers/v1/controller.py:
from pecan import rest
from wsme import types as wtypes
from webdemo2.api.expose import expose as wsexpose
from webdemo2.api.controllers.v1.users import UsersController
class V1Controller(rest.RestController):
users = UsersController()
@wsexpose(wtypes.text)
def get(self):
return 'webdemo2 v1controller'
api/controllers/v1/users.py:
from wsme import types as wtypes
from pecan import rest, expose
from webdemo2.api.expose import expose as wsexpose
class User(wtypes.Base):
id = wtypes.wsattr(wtypes.text, mandatory=True)
name = wtypes.text
age = int
class Users(wtypes.Base):
users = [User]
class UsersController(rest.RestController):
# HTTP GET /users/
@wsexpose(Users)
def get(self):
user_info_list = [
{
'id': '1',
'name': 'Alice',
'age': 30
},
{
'id': '2',
'name': 'Bob',
'age': 40
}
]
users_list = [User(**user_info) for user_info in user_info_list]
return Users(users=users_list)
# HTTP POST /users
@wsexpose(None, body=User, status_code=201)
def post(self, user):
print user
@expose()
def _lookup(self, user_id, *remainder):
return UserController(user_id), remainder
class UserController(rest.RestController):
_custom_actions = {
'kill': ['POST']
}
def __init__(self, user_id):
self.user_id = user_id
# HTTP GET /users/123456/
@wsexpose(User)
def get(self):
user_info = {
'id': self.user_id,
'name': 'Alice',
'age': 30
}
return User(**user_info)
# HTTP PUT /users/123456/
@wsexpose(User, body=User)
def put(self, user):
user_info = {
'id': self.user_id,
'name': user.name,
'age': user.age + 1
}
return User(**user_info)
# HTTP DELETE /users/123456/
@wsexpose()
def delete(self):
print ('Delete user_id: %s' % self.user_id)
# HTTP POST /users/123456/kill
@wsexpose(status_code=202)
def kill(self):
print ('Kill user_id: %s' % self.user_id)
cmd/api.py:
from wsgiref import simple_server
from webdemo2.api import app
def main():
application = app.setup_app()
srv = simple_server.make_server('', 8081, application)
print ('Server on port 8081, listening...')
srv.serve_forever()
if __name__ == '__main__':
main()