Быстрый старт
Создание простых обработчиков
rAPIdy
базируется на
aiohttp
и поддерживает все варианты определения обработчиков.
Ниже будут показаны лишь основные.
Все способы определения можно посмотреть здесь
Функциональные обработчики
from rapidy import Rapidy
from rapidy.http import post
@post('/')
async def handler() -> dict[str, str]:
return {'hello': 'rapidy'}
rapidy = Rapidy(http_route_handlers=[handler])
Регистрация без декоратора
Классовые обработчики
from rapidy import Rapidy
from rapidy.http import PathParam, controller, get, post, put, patch, delete
@controller('/')
class UserController:
@get('/{user_id}')
async def get_by_id(self, user_id: str = PathParam()) -> dict[str, str]:
return {'user_id': user_id}
@get()
async def get_all_users(self) -> list[dict[str, str]]:
return [{'name': 'John'}, {'name': 'Felix'}]
@post()
async def create_user(self) -> str:
return 'ok'
@put()
async def update_user(self) -> str:
return 'ok'
@patch()
async def patch_user(self) -> str:
return 'ok'
@delete()
async def delete_user(self) -> str:
return 'ok'
rapidy = Rapidy(http_route_handlers=[UserController])
Регистрация без декоратора
from rapidy import Rapidy
from rapidy.http import PathParam, controller, get
class UserController:
@get('/{user_id}')
async def get_by_id(self, user_id: str = PathParam()) -> dict[str, str]:
return {'user_id': user_id}
@get()
async def get_all_users(self) -> list[dict[str, str]]:
return [{'name': 'John'}, {'name': 'Felix'}]
rapidy = Rapidy(
http_route_handlers=[
controller.reg('/', UserController),
]
)
Middleware
Middleware — это промежуточные компоненты, которые обрабатывают запросы и ответы на уровне веб-фреймворка.
Они позволяют выполнять дополнительные действия до и/или после обработки запроса основным обработчиком.
from rapidy import Rapidy
from rapidy.http import Request, StreamResponse, get, middleware
from rapidy.typedefs import CallNext
@middleware
async def hello_middleware(request: Request, call_next: CallNext) -> StreamResponse:
request['data'] = {'hello': 'rapidy'}
return await call_next(request)
@get('/')
async def handler(request: Request) -> dict[str, str]:
return request['data']
rapidy = Rapidy(
http_route_handlers=[handler],
middlewares=[hello_middleware],
)
Примечание
В middleware-обработчике первым аргументом всегда должен быть Request, а вторым — call_next.
HTTPRoute
HTTPRoute
позволяет регистрировать группы обработчиков и играет ключевую роль в маршрутизации (routing),
помогая направлять запросы к нужным обработчикам в зависимости от HTTP-метода, пути, параметров и других условий.
HTTPRoute
регистрируется точно так же, как и любой HTTP-обработчик.
from rapidy import Rapidy
from rapidy.http import HTTPRouter, controller, get
@get('/hello')
async def hello_handler() -> dict[str, str]:
return {'hello': 'rapidy'}
@controller('/hello_controller')
class HelloController:
@get()
async def get_hello(self) -> dict[str, str]:
return {'hello': 'rapidy'}
api_router = HTTPRouter('/api', [hello_handler, HelloController])
rapidy = Rapidy(http_route_handlers=[api_router])
Регистрация обработчиков в роутере без декоратора
from rapidy import Rapidy
from rapidy.http import HTTPRouter, controller, get
async def hello_handler() -> dict[str, str]:
return {'hello': 'rapidy'}
class HelloController:
@get()
async def get_hello(self) -> dict[str, str]:
return {'hello': 'rapidy'}
api_router = HTTPRouter(
'/api',
[
get.reg('/hello', hello_handler),
controller.reg('/hello_controller', HelloController),
]
)
rapidy = Rapidy(http_route_handlers=[api_router])
Полный пример регистрации роутера и обработчиков
from rapidy import Rapidy
from rapidy.http import controller, get, HTTPRouter
@get('/hello')
async def hello_handler() -> dict[str, str]:
return {'hello': 'rapidy'}
@controller('/hello_controller')
class HelloController:
@get()
async def get(self) -> dict[str, str]:
return {'hello': 'rapidy'}
@get('/hi')
async def hi_handler() -> dict[str, str]:
return {'hi': 'rapidy'}
@controller('/hi_controller')
class HiController:
@get()
async def get(self) -> dict[str, str]:
return {'hi': 'rapidy'}
hello_api_router = HTTPRouter('/hello_api', [hello_handler, HelloController])
rapidy = Rapidy(
http_route_handlers=[
hello_api_router,
hi_handler,
HiController,
]
)
Пример простой валидации
from pydantic import BaseModel
from rapidy import Rapidy
from rapidy.http import Body, Request, Header, StreamResponse, middleware, post
from rapidy.typedefs import CallNext
TOKEN_REGEXP = '^[Bb]earer (?P<token>[A-Za-z0-9-_=.]*)'
class RequestBody(BaseModel):
username: str
password: str
class ResponseBody(BaseModel):
hello: str = 'rapidy'
@middleware
async def get_bearer_middleware(
request: Request,
call_next: CallNext,
bearer_token: str = Header(alias='Authorization', pattern=TOKEN_REGEXP),
) -> StreamResponse:
# process token here ...
return await call_next(request)
@post('/')
async def handler(body: RequestBody = Body()) -> ResponseBody:
return ResponseBody()
app = Rapidy(middlewares=[get_bearer_middleware], http_route_handlers=[handler])
Запуск веб-сервера
Простой запуск
Скопируйте код в файл main.py
.
from rapidy import Rapidy, run_app
from rapidy.http import post
@post('/')
async def handler() -> dict[str, str]:
return {'hello': 'rapidy'}
rapidy = Rapidy()
rapidy.add_http_router(handler)
if __name__ == '__main__':
run_app(rapidy)
Запустите сервер в режиме реального времени:
Также вы можете указать различные параметры запуска, например, host
или port
.
WSGI-запуск (Gunicorn)
Gunicorn — это Python WSGI HTTP-сервер для UNIX.
Что такое WSGI
WSGI (Web Server Gateway Interface — интерфейс шлюза Web-сервера) — это простой и универсальный интерфейс взаимодействия между Web-сервером и Web-приложением, впервые описанный в PEP-333.
Подробнее про gunicorn.org
Добавьте Gunicorn в ваш проект:
Скопируйте код в файл main.py
.
from rapidy import Rapidy
from rapidy.http import post
@post('/')
async def handler() -> dict[str, str]:
return {'hello': 'rapidy'}
rapidy = Rapidy()
rapidy.add_http_router(handler)
Запустите команду в консоли:
Команда gunicorn main:rapidy
обращается к:
main
: файлmain.py
(модуль Python).rapidy
: объект, созданный внутри файлаmain.py
в строкеrapidy = Rapidy()
.--reload
: перезапускает сервер после изменения кода. Используйте только для разработки.