使用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工具中测试

获取所有用户信息

增加用户 

获取单个用户信息——成功

获取单个用户信息——失败 

修改单个用户信息——成功

修改单个用户信息——失败

删除单个用户信息

posted on 2019-10-27 15:47  江湖乄夜雨  阅读(895)  评论(1编辑  收藏  举报