perf: 增加redis 和 mysql 连接配置生成
This commit is contained in:
parent
bdb665cf47
commit
0e966586b5
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
settings = Settings(_env_file='.env.development', _env_file_encoding='utf-8')
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
@ -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 = {
|
|||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue