Skip to main content

一款基于uvicorn的web协程框架

Project description

CheeseAPI

目前项目仍处于开发阶段,无法保证稳定性。

该文档是最新的beta版,如果你想要查看最新的发布版内容,请查看最新的tag。

介绍

一款基于uvicorn的web协程框架,目前仍处于开发阶段,一些基础功能已经可以使用。

目前仅保证支持python3.11。

功能

  1. 支持部分配置动态设置。

  2. 起飞般的请求速度。

  3. websocket支持。

  4. 类Django的项目结构。

  5. 外部模块导入。

安装

pip install CheeseAPI

你可能需要更多的插件:

  1. CheeseAPI_websocket

    基于CheeseAPI的升级版websocket。

使用

简单的示例

创建一个入口文件:

# File path: /app.py

from CheeseAPI import app, Request, Response

@app.route('/', [ 'GET' ])
async def index(request: Request):
    return Response('你好,这里是CheeseAPI!')

使用命令行启动服务器,你可以看到相应的信息打印在控制台上(默认为彩色打印):

$ CheeseAPI --app app:app
(STARTING) 2023-08-01 00:44:11.143085 > Started CheeseAPI master process 92102
(STARTING) 2023-08-01 00:44:11.143122 > The application starts loading...
(STARTING) 2023-08-01 00:44:11.143133 > System information:
    system: MacOS
    python version: 3.11.4
    CheeseAPI version: 0.0.1
(STARTING) 2023-08-01 00:44:11.143142 > Workspace information:
    CheeseAPI path: /Users/cheese/Desktop/CheeseAPI/CheeseAPI
    base path: /Users/cheese/Desktop/CheeseAPI
(STARTING) 2023-08-01 00:44:11.143155 > Server information:
    host: 127.0.0.1
    port: 5214
    workers: 1
    is reload: False
    is debug: False
    is request logged: True
(STARTING) 2023-08-01 00:44:11.143215 > The server running on http://127.0.0.1:5214
(STARTING) 2023-08-01 00:44:11.153093 > The server started, took 0.009919 seconds

此时访问GET http://127.0.0.1:5214,会返回相应的Response

项目结构

CheeseAPI采用类Django的结构:

| - User
    | - model.py
    | - api.py
    | - service.py
    | - decorator.py
| - Permission
    | - model.py
    | - api.py
    | - service.py
    | - decorator.py
| - app.py

在项目根目录下的文件夹(不包括隐藏文件夹)内的文件会在项目启动时自动导入。

在CheeseAPI中并没有强制规定文件名与其代码的关联性,但建议的文件命名方式如下:

文件名 备注
model.py 模型类
api.py api接口
service.py 业务逻辑实现
decorator.py 装饰器

用户的增删改查

该示例仅为演示,所用用户结构为普通的class构建,在正常项目中你应该使用SQLORM

在开始,首先需要创建一个用户类:

# File path: /User/model.py

import datetime, uuid
from enum import Enum
from typing import Optional

class Gender(Enum):
    MALE = 0
    FEMALE = 1
    UNKNOWN = 2

class User:
    def __init__(self, nickname: str, password: str, gender: Optional[Gender] = Gender.UNKNOWN):
        self.id: uuid.UUID = uuid.uuid4()
        self.nickname: str = nickname
        self.password: str = password
        self.gender: Gender = gender
        self.join_date: datetime.datetime = datetime.datetime.now()

实现增删改查的逻辑代码:

# File path: /User/service.py

import uuid
from typing import Optional, Dict

from User.model import User, Gender

users: Dict[uuid.UUID, User] = {}
loginUsers: Dict[uuid.UUID, User] = {}

# 注册用户
def register(nickname: str, password: str, gender: Gender):
    user = User(nickname, password, gender)
    users[user.id] = user

# 登入用户
def login(nickname: str, password: str) -> User | None:
    for id, user in users.item():
        if user.nickname == nickname and user.password == password:
            loginUsers[id] = user
            return user
    return None

# 登出用户
def logout(id: uuid.UUID):
    if id in loginUsers:
        del loginUsers[id]

# 获取用户
def get_user(id: uuid.UUID) -> User | None:
    if id in users:
        return users[id]
    return None

# 修改用户信息
def set_user(id: uuid.UUID, nickname: str | None, password: str | None, gender: Gender | None) -> User | None:
    if id in users:
        user = users[id]
        if nickname:
            user.nickname = nickname
        if password:
            user.password = password
        if gender:
            user.gender = gender
        return user
    return None

# 删除用户
def delete_user(id: uuid.UUID) -> bool:
    if id in loginUsers:
        del loginUsers[id]
    if id in users:
        del users[id]
        return True
    return False

实现API接口,在实际项目中,你需要先进行数据的初步校验:

# File path:

import uuid

from CheeseAPI import app, Request, Route, Response, JsonResponse

from User.model import Gender
from User import service

route = Route('/User', app.route)

@route.post('/register')
def register(request: Request):
    nickname = request.form.get('nickname')
    password = request.form.get('password')
    gender = Gender(int(request.form.get('gender', 2)))
    service.register(nickname, password, gender)
    return Response('注册成功!')

@route.post('/login')
def login(request: Request):
    nickname = request.form.get('nickname')
    password = request.form.get('password')
    user = service.login(nickname, password)
    if user:
        return JsonResponse(user.__dict__)
    return Response('登入失败!', 401)

@route.post('/<id:uuid>/logout')
def logout(id: uuid.UUID):
    service.logout(id)
    return Response('登出成功!')

@route.get('/<id:uuid>')
def get_user(id: uuid.UUID):
    user = service.get_user(id)
    if user:
        return JsonResponse(user.__dict__)
    return Response('查找失败!', 404)

@route.put('/<id:uuid>')
def set_user(id: uuid.UUID):
    nickname = request.form.get('nickname')
    password = request.form.get('password')
    gender = request.form.get('gender')
    if gender:
        gender = Gender(gender)
    user = service.set_user(id, nickname, password, gender)
    if user:
        return JsonResponse(user.__dict__)
    return Response('修改信息失败!', 404)

@route.delete('/<id:uuid>')
def delete_user(id: uuid.UUID):
    flag = service.delete_user(id)
    if flag:
        return Response('删除用户成功!')
    return Response('删除用户失败!', 404)

这样,一个简陋的用户系统就搭建完成了,其中有很多纰漏例如会把密码返回出去 :(

更多...

1. 命令行

2. 详细配置

3. 模块

4. 路由

5. 请求

6. 响应

7. 装饰器

8. websocket

9. 信号

10. 文件

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

CheeseAPI-0.0.20.tar.gz (18.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

CheeseAPI-0.0.20-py3-none-any.whl (22.1 kB view details)

Uploaded Python 3

File details

Details for the file CheeseAPI-0.0.20.tar.gz.

File metadata

  • Download URL: CheeseAPI-0.0.20.tar.gz
  • Upload date:
  • Size: 18.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for CheeseAPI-0.0.20.tar.gz
Algorithm Hash digest
SHA256 b57dd1606200213991079e1d6aa1e192e1ec81ca6e3bbfb70f36ba0da2c4b5e9
MD5 cf4c4240b9f8408417e2329169f9b749
BLAKE2b-256 b9b16ada29fcb54e7c09f799de542e4da7dbfe5331de3d179d2fbaa7504fa2d6

See more details on using hashes here.

File details

Details for the file CheeseAPI-0.0.20-py3-none-any.whl.

File metadata

  • Download URL: CheeseAPI-0.0.20-py3-none-any.whl
  • Upload date:
  • Size: 22.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for CheeseAPI-0.0.20-py3-none-any.whl
Algorithm Hash digest
SHA256 ecc1c46e18f3aa4c2dd8bcbdcce07ea163cd0b840c8c717f2cc579a71d144893
MD5 10bb125c7a0fffce0ec144dcb5e21251
BLAKE2b-256 a7e6e5a9774943e493c7d91c996473ceffd3b11f3d19c3153f359ea8ffb336da

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page