-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathasgi.py
78 lines (67 loc) · 2.76 KB
/
asgi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# pylint: disable=[invalid-name,import-outside-toplevel]
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from starlite import Starlite
__all__ = ["run_app"]
def run_app() -> Starlite:
"""Create ASGI application."""
from datetime import datetime
from uuid import UUID
from asyncpg.pgproto import pgproto
from pydantic import BaseModel, EmailStr, SecretStr
from sqlalchemy.ext.asyncio import AsyncSession
from starlite import Starlite
from starlite.connection import ASGIConnection, Request
from starlite.contrib.repository.filters import (
BeforeAfter,
CollectionFilter,
LimitOffset,
)
from starlite.di import Provide
from app import domain
from app.domain.accounts.models import User
from app.domain.security import provide_user
from app.domain.web.vite import template_config
from app.lib import cache, compression, constants, cors, db, exceptions, log, settings, static_files
from app.lib.dependencies import FilterTypes, create_collection_dependencies
dependencies = {constants.USER_DEPENDENCY_KEY: Provide(provide_user)}
dependencies.update(create_collection_dependencies())
def _base_model_encoder(value: BaseModel) -> dict[str, Any]:
return value.dict(by_alias=True)
return Starlite(
response_cache_config=cache.config,
stores=[cache.store],
compression_config=compression.config,
cors_config=cors.config,
dependencies=dependencies,
exception_handlers={
exceptions.ApplicationError: exceptions.exception_to_http_response,
},
debug=settings.app.DEBUG,
before_send=[log.controller.BeforeSendHandler()],
middleware=[log.controller.middleware_factory],
logging_config=log.config,
openapi_config=domain.openapi.config,
type_encoders={pgproto.UUID: str, BaseModel: _base_model_encoder, SecretStr: str},
route_handlers=[*domain.routes],
plugins=[db.plugin],
on_shutdown=[cache.redis.close],
on_startup=[lambda: log.configure(log.default_processors)], # type: ignore[arg-type]
on_app_init=[domain.security.auth.on_app_init],
static_files_config=static_files.config,
template_config=template_config, # type: ignore[arg-type]
signature_namespace={
"AsyncSession": AsyncSession,
"FilterTypes": FilterTypes,
"BeforeAfter": BeforeAfter,
"CollectionFilter": CollectionFilter,
"LimitOffset": LimitOffset,
"UUID": UUID,
"EmailStr": EmailStr,
"datetime": datetime,
"User": User,
"ASGIConnection": ASGIConnection,
"Request": Request,
},
)