使用tornado实现一个简单的RESTfulAPI
概述
本文使用tornado实现了一个简单的基于RESTful的用户管理API。
目录结构及代码
models中是用户的数据以及用户管理的方法(增删改查)。
handlers中是处理用户信息的类。
app.py文件是程序的入口。
models中的user.py:
# -*- coding:utf-8 -*- class UserModel(object): users = { 1: {"name": 'whw', 'age': 18}, 2: {"name": 'naruto', 'age': 28}, 3: {"name": 'sasuke', 'age': 38}, } @classmethod def get(cls, user_id): return cls.users[user_id] @classmethod def get_all(cls): return list(cls.users.values()) @classmethod def create(cls, name, age): user_dict = {"name": name, "age": age} user_id = max(cls.users.keys()) + 1 cls.users[user_id] = user_dict @classmethod def update(cls, user_id, age): if cls.users.get(user_id): cls.users[user_id]['age'] = age # 返回修改后的数据 return cls.users[user_id] else: return {"status": False, "msg": "This User Doesn't Exist!" } @classmethod def delete(cls, user_id): if cls.users.get(user_id): # 返回被删除的数据 return cls.users.pop(user_id) else: return {"status": False, "msg": "查无此人!" }
handlers中的user.py:
# -*- coding:utf-8 -*- import traceback import tornado.web from tornado.escape import json_encode # 将Python对象序列化为JSON字符串 from models.user import UserModel class UserListHandler(tornado.web.RequestHandler): ### 获取多个对象的get方法 def get(self): users = UserModel.get_all() # 这里的users是一个字典 self.write(json_encode(users)) def post(self): # get_argument方法 name = self.get_argument("name") age = self.get_argument("age") UserModel.create(name,age) ret = {"status":True,"msg":"create user %s successfully!"%name} self.write(json_encode(ret)) class UserHandler(tornado.web.RequestHandler): ### 获取单个对象的get方法 # 正常情况下如果有异常应该在后台处理,给前端返回一个提示,这里为了试验一下set_status方法用异常捕获去做 def get(self,user_id): try: # 注意user_id是int类型的,需要强转一下 user = UserModel.get(int(user_id)) except Exception: # 使用traceback模块打印出异常,当然也可以将异常写在文件中! print(traceback.format_exc()) # 如果user_id不存在de话,返回一个404页面 return self.set_status(404) self.write(json_encode(user)) # 修改 def put(self,user_id): # 年龄是api请求传过来的数据! ### 简化操作,不对age进行校验了~~ age = self.get_argument("age") # 注意,需要将user_id强转成int类型!~为了简化操作,不对age进行校验了 ret = UserModel.update(int(user_id),age) self.write(json_encode(ret)) # 删除 def delete(self,user_id): # 注意,需要将user_id强转成int类型! ret = UserModel.delete(int(user_id)) self.write(json_encode(ret))
app.py:
# -*- coding:utf-8 -*- import tornado.web import tornado.ioloop import tornado.httpserver from handlers.user import UserListHandler, UserHandler HANDLERS = [ (r"/api/users", UserListHandler), (r"/api/user/(\d+)", UserHandler) ] def run(): app = tornado.web.Application( HANDLERS, debug=True, ) http_server = tornado.httpserver.HTTPServer(app) port = 9999 http_server.listen(port) print("server started on port {}".format(port)) tornado.ioloop.IOLoop.instance().start() if __name__ == '__main__': run()
在postman工具中测试
获取所有用户信息
增加用户
获取单个用户信息——成功
获取单个用户信息——失败
修改单个用户信息——成功
修改单个用户信息——失败
删除单个用户信息