diff --git a/.env.development b/.env.development index 658843f..8a5b05d 100644 --- a/.env.development +++ b/.env.development @@ -11,7 +11,7 @@ MYSQL_PASSWORD=123456 MYSQL_DB=mall # redis -REDIS_ADDRESS=localhost:6379 +REDIS_ADDRESS=127.0.0.1:6379 #rabbitMQ RABBITMQ_ADDRESS=localhost:5672 diff --git a/common/config.py b/common/config.py index e359d9f..e0c92c5 100644 --- a/common/config.py +++ b/common/config.py @@ -1,7 +1,32 @@ import secrets from typing import Optional +from typing import Dict +from typing import Any -from pydantic import BaseSettings, HttpUrl +from pydantic import BaseSettings +from pydantic import HttpUrl +from pydantic import validator +from pydantic import AnyUrl + + +class MysqlDsn(AnyUrl): + allowed_schemes = {'mysql'} + user_required = True + + +class RedisDsn(AnyUrl): + allowed_schemes = {'redis'} + + @classmethod + def validate_parts(cls, parts: Dict[str, str]) -> Dict[str, str]: + defaults = { + 'domain': 'localhost' if not (parts['ipv4'] or parts['ipv6']) else '', + 'port': '6379' + } + for key, value in defaults.items(): + if not parts[key]: + parts[key] = value + return super().validate_parts(parts) class Settings(BaseSettings): @@ -18,9 +43,33 @@ class Settings(BaseSettings): MYSQL_USER: str MYSQL_PASSWORD: str MYSQL_DB: str + MYSQL_DATABASE_URL: Optional[MysqlDsn] = None + + @validator("MYSQL_DATABASE_URL", pre=True) + def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any: + if isinstance(v, str): + return v + return MysqlDsn.build( + scheme="mysql", + user=values.get("MYSQL_USER"), + password=values.get("MYSQL_PASSWORD"), + host=values.get("MYSQL_ADDRESS"), + path=f"/{values.get('MYSQL_DB') or ''}", + ) # redis, ip + 端口 REDIS_ADDRESS: str + REDIS_URL: Optional[RedisDsn] = None + + @validator("REDIS_URL", pre=True) + def assemble_redis_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any: + if isinstance(v, str): + return v + return RedisDsn.build( + scheme="redis", + host=values.get("REDIS_ADDRESS") + ) + # rabbitMQ RABBITMQ_ADDRESS: str ... @@ -34,4 +83,4 @@ class Settings(BaseSettings): # pip freeze > requirements.txt # settings = Settings(_env_file='../.env.development', _env_file_encoding='utf-8') -settings = Settings(_env_file='.env.development', _env_file_encoding='utf-8') \ No newline at end of file +settings = Settings(_env_file='.env.development', _env_file_encoding='utf-8') diff --git a/common/middleware.py b/common/middleware.py index e69de29..3ef774d 100644 --- a/common/middleware.py +++ b/common/middleware.py @@ -0,0 +1,15 @@ +import sentry_sdk +from sentry_sdk.integrations.asgi import SentryAsgiMiddleware +from fastapi.middleware.cors import CORSMiddleware +from common.config import settings + +sentry_sdk.init(settings.SENTRY_DSN) + + +middlewares = [ + SentryAsgiMiddleware, + CORSMiddleware(allow_origins=['*'], allow_methods=['*'], allow_headers=['*']) +] + + +__all__ = [middlewares] diff --git a/common/utils.py b/common/utils.py index 0a0c73a..e677c94 100644 --- a/common/utils.py +++ b/common/utils.py @@ -3,8 +3,7 @@ from typing import List from typing import NoReturn from typing import Optional -import sentry_sdk -from sentry_sdk.integrations.asgi import SentryAsgiMiddleware + from aioredis import Redis from aioredis import from_url from fastapi import FastAPI @@ -13,23 +12,6 @@ from tortoise.contrib.fastapi import register_tortoise from common.config import settings -sentry_sdk.init(settings.SENTRY_DSN) - - -def mysql_cdn(): - """mysql cdn 完整地址""" - return f'mysql://{settings.MYSQL_USER}:{settings.MYSQL_PASSWORD}@{settings.MYSQL_ADDRESS}/{settings.MYSQL_DB}' - - -def redis_cdn(): - """redis cdn""" - return f'redis://{settings.REDIS_ADDRESS}' - - -def register_middleware(app: FastAPI): - """注册 日志错误收集 中间件""" - app.add_middleware(SentryAsgiMiddleware) - def register_orm(app: FastAPI, modules: Optional[Dict[str, List[str]]] = None) -> NoReturn: """注册orm""" @@ -37,14 +19,14 @@ def register_orm(app: FastAPI, modules: Optional[Dict[str, List[str]]] = None) - modules = {"models": ["models"]} register_tortoise( app, - db_url=mysql_cdn(), + db_url=settings.MYSQL_DATABASE_URL, modules=modules ) def redis_pool() -> Dict[int, Redis]: """redis 16个db 每个创建池""" - return {db: from_url(redis_cdn(), db=db, max_connections=10, encoding="utf-8", decode_responses=True) + return {db: from_url(settings.REDIS_URL, db=db, max_connections=10, encoding="utf-8", decode_responses=True) for db in range(16) } @@ -74,7 +56,7 @@ def register_redis(app: FastAPI): # orm 迁移生成表 # https://tortoise.github.io/migration.html TORTOISE_ORM = { - "connections": {"default": mysql_cdn()}, + "connections": {"default": settings.MYSQL_DATABASE_URL}, "apps": { "models": { "models": ["models", "aerich.models"], @@ -82,3 +64,5 @@ TORTOISE_ORM = { }, } } + + diff --git a/main.py b/main.py index e69de29..3f0626c 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,4 @@ +from common.config import settings + +print(settings.MYSQL_DATABASE_URL) +print(settings.REDIS_URL) \ No newline at end of file