mirror of
https://github.com/fastapi-practices/fastapi-best-architecture.git
synced 2026-09-21 13:12:24 +00:00
Add environment variable management and fix Pydantic validation error (#15)
* Use env to manage important configurations and distinguish environments * fix Pydantic validation error caused by None value in links field of Page class * Production environment no longer exposes API docs * Extract TOKEN_URL to conf
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# env: test、dev、pro
|
||||
ENVIRONMENT='pro'
|
||||
# mysql
|
||||
DB_HOST='127.0.0.1'
|
||||
DB_PORT=3306
|
||||
DB_USER='root'
|
||||
DB_PASSWORD=''
|
||||
# redis
|
||||
REDIS_HOST='127.0.0.1'
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=''
|
||||
REDIS_DATABASE=0
|
||||
# APScheduler
|
||||
APS_REDIS_HOST='127.0.0.1'
|
||||
APS_REDIS_PORT=6379
|
||||
APS_REDIS_PASSWORD=''
|
||||
# token
|
||||
TOKEN_SECRET_KEY='1VkVF75nsNABBjK_7-qz7GtzNy3AMvktc9TCPwKczCk'
|
||||
# email
|
||||
EMAIL_USER='xxxx-nav@qq.com'
|
||||
EMAIL_PASSWORD=''
|
||||
@@ -18,7 +18,7 @@ from backend.app.models import User
|
||||
|
||||
pwd_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
|
||||
|
||||
oauth2_schema = OAuth2PasswordBearer(tokenUrl='/v1/users/login')
|
||||
oauth2_schema = OAuth2PasswordBearer(tokenUrl=settings.TOKEN_URL)
|
||||
|
||||
|
||||
def get_hash_password(password: str) -> str:
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
from typing import TypeVar, Generic, Sequence, Dict
|
||||
from typing import TypeVar, Generic, Sequence, Dict, Union
|
||||
|
||||
from fastapi import Query
|
||||
from fastapi_pagination.bases import AbstractPage, AbstractParams, RawParams
|
||||
@@ -35,7 +35,7 @@ class Page(AbstractPage[T], Generic[T]):
|
||||
page: int # 第n页
|
||||
size: int # 每页数量
|
||||
total_pages: int # 总页数
|
||||
links: Dict[str, str] # 跳转链接
|
||||
links: Dict[str, Union[str, None]] # 跳转链接
|
||||
|
||||
__params_type__ = Params # 使用自定义的Params
|
||||
|
||||
|
||||
+27
-16
@@ -3,18 +3,25 @@
|
||||
from functools import lru_cache
|
||||
from typing import Optional
|
||||
|
||||
from pydantic import BaseSettings
|
||||
from pydantic import BaseSettings, root_validator
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
ENVIRONMENT: str
|
||||
# FastAPI
|
||||
TITLE: str = 'FastAPI'
|
||||
VERSION: str = 'v0.0.1'
|
||||
DESCRIPTION: str = "FastAPI Best Architecture"
|
||||
DOCS_URL: Optional[str] = '/v1/docs'
|
||||
REDOCS_URL: Optional[str] = None
|
||||
REDOCS_URL: Optional[str] = '/v1/redocs'
|
||||
OPENAPI_URL: Optional[str] = '/v1/openapi'
|
||||
|
||||
@root_validator
|
||||
def validator_api_url(cls, values):
|
||||
if values['ENVIRONMENT'] == 'pro':
|
||||
values['OPENAPI_URL'] = None
|
||||
return values
|
||||
|
||||
# Uvicorn
|
||||
UVICORN_HOST: str = '127.0.0.1'
|
||||
UVICORN_PORT: int = 8000
|
||||
@@ -25,24 +32,24 @@ class Settings(BaseSettings):
|
||||
|
||||
# MySQL
|
||||
DB_ECHO: bool = False
|
||||
DB_HOST: str = '127.0.0.1'
|
||||
DB_PORT: int = 3306
|
||||
DB_USER: str = 'root'
|
||||
DB_PASSWORD: str = '123456'
|
||||
DB_HOST: str
|
||||
DB_PORT: int
|
||||
DB_USER: str
|
||||
DB_PASSWORD: str
|
||||
DB_DATABASE: str = 'fba'
|
||||
DB_CHARSET: str = 'utf8mb4'
|
||||
|
||||
# Redis
|
||||
REDIS_HOST: str = '127.0.0.1'
|
||||
REDIS_PORT: int = 6379
|
||||
REDIS_PASSWORD: str = ''
|
||||
REDIS_DATABASE: int = 0
|
||||
REDIS_HOST: str
|
||||
REDIS_PORT: int
|
||||
REDIS_PASSWORD: str
|
||||
REDIS_DATABASE: int
|
||||
REDIS_TIMEOUT: int = 5
|
||||
|
||||
# APScheduler DB
|
||||
APS_REDIS_HOST: str = '127.0.0.1'
|
||||
APS_REDIS_PORT: int = 6379
|
||||
APS_REDIS_PASSWORD: str = ''
|
||||
APS_REDIS_HOST: str
|
||||
APS_REDIS_PORT: int
|
||||
APS_REDIS_PASSWORD: str
|
||||
APS_REDIS_DATABASE: int = 1
|
||||
APS_REDIS_TIMEOUT: int = 10
|
||||
|
||||
@@ -53,15 +60,16 @@ class Settings(BaseSettings):
|
||||
|
||||
# Token
|
||||
TOKEN_ALGORITHM: str = 'HS256' # 算法
|
||||
TOKEN_SECRET_KEY: str = '1VkVF75nsNABBjK_7-qz7GtzNy3AMvktc9TCPwKczCk' # 密钥 secrets.token_urlsafe(32))
|
||||
TOKEN_SECRET_KEY: str # 密钥 secrets.token_urlsafe(32))
|
||||
TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 1 # token 时效 60 * 24 * 1 = 1 天
|
||||
TOKEN_URL: str = '/v1/users/login'
|
||||
|
||||
# Email
|
||||
EMAIL_DESCRIPTION: str = 'fastapi_sqlalchemy_mysql' # 默认发件说明
|
||||
EMAIL_SERVER: str = 'smtp.qq.com'
|
||||
EMAIL_PORT: int = 465
|
||||
EMAIL_USER: str = 'xxxx-nav@qq.com'
|
||||
EMAIL_PASSWORD: str = '' # 授权密码,非邮箱密码
|
||||
EMAIL_USER: str
|
||||
EMAIL_PASSWORD: str # 授权密码,非邮箱密码
|
||||
EMAIL_SSL: bool = True # 是否使用ssl
|
||||
|
||||
# 邮箱登录验证码过期时间
|
||||
@@ -75,6 +83,9 @@ class Settings(BaseSettings):
|
||||
MIDDLEWARE_GZIP: bool = True
|
||||
MIDDLEWARE_ACCESS: bool = False
|
||||
|
||||
class Config:
|
||||
env_file = '.env'
|
||||
|
||||
|
||||
@lru_cache
|
||||
def get_settings():
|
||||
|
||||
Reference in New Issue
Block a user