随笔 - 231  文章 - 205  评论 - 20  阅读 - 41万

使用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   江湖乄夜雨  阅读(913)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示