一款基于uvicorn的web协程框架
Project description
CheeseAPI
目前项目仍处于开发阶段,无法保证稳定性。
该文档是最新的beta版,如果你想要查看最新的发布版内容,请查看最新的tag。
介绍
一款基于uvicorn的web协程框架,目前仍处于开发阶段,一些基础功能已经可以使用。
目前仅保证支持python3.11。
功能
-
支持部分配置动态设置。
-
起飞般的请求速度。
-
websocket支持。
-
类Django的项目结构。
-
外部模块导入。
安装
pip install CheeseAPI
你可能需要更多的插件:
-
基于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构建,在正常项目中你应该使用SQL或ORM。
在开始,首先需要创建一个用户类:
# 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b57dd1606200213991079e1d6aa1e192e1ec81ca6e3bbfb70f36ba0da2c4b5e9
|
|
| MD5 |
cf4c4240b9f8408417e2329169f9b749
|
|
| BLAKE2b-256 |
b9b16ada29fcb54e7c09f799de542e4da7dbfe5331de3d179d2fbaa7504fa2d6
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecc1c46e18f3aa4c2dd8bcbdcce07ea163cd0b840c8c717f2cc579a71d144893
|
|
| MD5 |
10bb125c7a0fffce0ec144dcb5e21251
|
|
| BLAKE2b-256 |
a7e6e5a9774943e493c7d91c996473ceffd3b11f3d19c3153f359ea8ffb336da
|