Быстрый старт#
В этом руководстве вы соберёте небольшой REST-сервис, который:
- Использует in-memory-хранилище (без БД).
- Использует одну DM-модель.
- Использует минимальный API-слой (контроллер + роут).
- Запускается как WSGI-приложение.
В конце у вас будет HTTP API на http://127.0.0.1:8000/.
1. Структура проекта#
Создайте директорию и файл:
Весь код ниже размещается в app.py.
2. Простая DM-модель#
from wsgiref.simple_server import make_server
from restalchemy.api import applications
from restalchemy.api import controllers
from restalchemy.api import middlewares
from restalchemy.api import resources
from restalchemy.api import routes
from restalchemy.dm import models
from restalchemy.dm import properties
from restalchemy.dm import types
# Simple data model for a "Foo" resource
class FooModel(models.ModelWithUUID):
value = properties.property(types.Integer(), required=True)
FooModel — DM-модель с:
- Автоматически генерируемым UUID (унаследовано от
ModelWithUUID). - Одним целочисленным полем
value.
3. In-memory-хранилище#
Для экспериментов достаточно словаря:
4. Контроллер#
Контроллер реализует логику для HTTP-методов CREATE, GET и FILTER:
class FooController(controllers.Controller):
__resource__ = resources.ResourceByRAModel(FooModel, process_filters=True)
def create(self, value):
foo = self.model(value=value)
FOO_STORAGE[str(foo.get_id())] = foo
return foo
def get(self, uuid):
return FOO_STORAGE[uuid]
def filter(self, filters, order_by=None):
return FOO_STORAGE.values()
5. Маршруты#
Маршруты сопоставляют URL и методы контроллерам:
class FooRoute(routes.Route):
__controller__ = FooController
__allow_methods__ = [routes.CREATE, routes.GET, routes.FILTER]
class ApiRoot(routes.Route):
__controller__ = controllers.RootController
__allow_methods__ = [routes.FILTER]
foos = routes.route(FooRoute)
Теперь:
GET /— корневой список маршрутов.POST /foos/— создание новогоFooModel.GET /foos/<uuid>— получение одного объекта.GET /foos/— список всех объектов.
6. WSGI-приложение#
def get_user_api_application():
return ApiRoot
def build_wsgi_application():
return middlewares.attach_middlewares(
applications.WSGIApp(get_user_api_application()),
[],
)
7. Запуск сервера#
HOST = "127.0.0.1"
PORT = 8000
def main():
server = make_server(HOST, PORT, build_wsgi_application())
try:
print(f"Serve forever on {HOST}:{PORT}")
server.serve_forever()
except KeyboardInterrupt:
print("Bye")
if __name__ == "__main__":
main()
Запуск:
Вы должны увидеть:
8. Проверка API#
Создание Foo:
curl -X POST "http://127.0.0.1:8000/foos/" \
-H "Content-Type: application/json" \
-d '{"value": 42}'
Список всех:
Получение одного объекта (подставьте <uuid>):
9. Дальнейшие шаги#
После минимального in-memory-сервиса можно:
- Перейти к SQL-хранилищу (см.
concepts/data-model.md,concepts/storage-layer.mdи how-to по DM+SQL). - Посмотреть полный пример
examples/restapi_foo_bar_service.py. - Изучить фильтры, связи и другие сценарии в how-to-разделах.