torando rest

使用Tornado REST框架来构建用于访问用户的简单模型支持的API的快速示例

设置一个新项目:

.
├── handlers
│   └── user.py
├── models
│   └── user.py
├── routers
│   └── user.py
├── serializers
│   └── user.py
├── app.py
├── settings.py

使用Tornado REST框架时,必须告诉它所使用的设置。通过使用环境变量:TORNADO_SETTINGS_MODULE来执行此操作

TORNADO_SETTINGS_MODULE的值应采用Python路径语法,例如foo.settings。请注意,设置模块应位于Python导入搜索路径上。

$ export TORNADO_SETTINGS_MODULE=settings

将以下内容添加到您的settings.py中:

# settings.py
import os

BASE_DIR = os.path.dirname(__file__)

debug = True
secret_key = "******"

routers_path = os.path.join(BASE_DIR, "routers")
api_prefix = "/api"
trailing_slash = False

mysql_host = "127.0.0.1"
mysql_port = 3306
mysql_username = "root"
mysql_password = "******"
mysql_dbname = ""

创建一个可以使用的模型:

# models/user.py
from tornado_restful import models


class User(models.Model):
    name = models.CharField(max_length=20, unique=True)
    email = models.CharField(max_length=30, unique=True)

创建一个序列化器:

# serializers/user.py
from tornado_restful.models import db
from tornado_restful.serializers import Serializer, fields, validate

from models.user import User


class UserSerializer(Serializer):
    id = fields.Int(dump_only=True)
    name = fields.Str(
        required=True,
        validate=[
            validate.Length(min=2, max=20),
            validate.Regexp("^[a-zA-Z][a-zA-Z0-9_-]*$")
        ],
    )
    email = fields.Email(required=True, validate=validate.Length(max=30))

    async def create(self, validated_data):
        return await db.create(User, **validated_data)

    async def update(self, instance, validated_data):
        instance.email = validated_data.get("email", instance.email)
        await db.update(instance)
        return instance

class:

# handlers/user.py
from tornado_restful import status
from tornado_restful.exceptions import NotFoundError
from tornado_restful.handlers import APIHandler

from models.user import User
from serializers.user import UserSerializer

class UserHandler(APIHandler):
    async def list(self):
        limit, offset = self.paginate()
        async with self.application.db.atomic():
            users = await self.application.db.execute(
                User.select().limit(limit).offset(offset)
            )
            total = await self.application.db.count(User.select())
        serializer = UserSerializer(users, many=True)
        self.set_status(status.HTTP_200_OK)
        return self.finish({"total": total, "results": serializer.data})

    async def retrieve(self, pk):
        user = await self.get_object(pk)
        serializer = UserSerializer(user)
        self.set_status(status.HTTP_200_OK)
        return self.finish(serializer.data)

    async def create(self):
        serializer = UserSerializer(data=self.request.data)
        serializer.is_valid(raise_exception=True)
        await serializer.save()
        self.set_status(status.HTTP_201_CREATED)
        return self.finish(serializer.data)

    async def partial_update(self, pk):
        user = await self.get_object(pk)
        serializer = UserSerializer(user, self.request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        await serializer.save()
        self.set_status(status.HTTP_200_OK)
        return self.finish(serializer.data)

    async def destroy(self, pk):
        user = await self.get_object(pk)
        await self.application.db.delete(user)
        self.set_status(status.HTTP_204_NO_CONTENT)
        return self.finish()

    async def get_object(self, pk):
        try:
            user = await self.application.db.get(User, name=pk)
        except User.DoesNotExist:
            raise NotFoundError
        return user

Url:

# routers/user.py
from tornado_restful.routers import NestedRouter

from handlers.user import UserHandler

router = NestedRouter()
router.register(r"users", UserHandler)

为项目提供一个入口:

# app.py
import tornado.ioloop
import tornado.web

from tornado_restful.conf import settings
from tornado_restful.handlers import NotFoundHandler
from tornado_restful.models import db
from tornado_restful.shortcuts import get_routes


def runserver():
    app = tornado.web.Application(
        handlers=get_routes(),
        debug=settings.debug,
        default_handler_class=NotFoundHandler,
    )
    app.db = db
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()


if __name__ == "__main__":
    runserver()

Serve:

python app.py
内容概要:《中国HR+HER2-早期乳腺癌患者诊疗需求调研白皮书》聚焦于中国早期HR+/HER2-乳腺癌患者的诊疗现状和需求。白皮书通过定量调研,揭示了患者在确诊、复发风险评估、术后辅助治疗及长期管理等各阶段面临的挑战,包括对新药的期待、信息需求及信息渠道偏好。调研显示,患者对新型辅助治疗方案的疗效和生活质量提升寄予厚望,但也存在对不良反应的担忧。此外,患者在理解诊断报告、复发风险认知及获取权威信息方面存在诸多障碍。白皮书呼吁加强患者教育、优化医患沟通、提高新药可及性,以改善患者预后和生活质量。 适合人群:早期HR+/HER2-乳腺癌患者、家属、临床医生及相关医疗工作者。 使用场景及目标:①帮助患者更好地理解诊断结果和后续治疗方案;②为临床医生提供患者需求和挑战的真实数据,优化诊疗路径;③推动社会各界关注和支持早期乳腺癌患者的教育和管理,助力患者早日康复,重获高质量生活。 其他说明:白皮书强调了早期乳腺癌患者在诊疗旅程中面临的多重障碍,包括早期筛查覆盖率不足、复发风险认知偏差及医患沟通壁垒。为应对这些挑战,白皮书提出了多项改进建议,如加强乳腺健康教育、优化诊断结果沟通方式、提升患者对复发风险的认知、强化不良反应管理及构建权威信息平台等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值