
    zWi                         S r SSKJrJr  SSKJr  SSKrSSKJr   \" 5         \ " S S5      5       r
\ " S S	5      5       r\ " S
 S5      5       r\ " S S5      5       r\ " S S5      5       rg! \	 a     NTf = f)uE   
应用配置类

使用 dataclass 提供类型安全的配置管理
    )	dataclassfield)OptionalN)load_dotenvc                       \ rS rSr% Sr\\S'   Sr\\S'   Sr\	\S'   Sr
\\S	'   S
r\\S'   Sr\	\S'   Sr\	\S'   \S\	4S j5       r\S\	4S j5       r\SS j5       rSrg)	AppConfig   u   应用配置
secret_keydevelopmentenvironmentFdebug0.0.0.0hosti  portTthreadeduse_reloaderreturnc                      U R                   S:H  $ )u   是否为生产环境
productionr   selfs    ;   /Users/yu22x/Desktop/ddd_副本130/ctf/config/app_config.pyis_productionAppConfig.is_production   s     <//    c                      U R                   S:H  $ )u   是否为开发环境r   r   r   s    r   is_developmentAppConfig.is_development$   s     =00r   c                 N   [         R                  " SS5      nUS:H  nU(       d(  [         R                  " SS5      R                  5       S:H  OSnU " [         R                  " SS	5      UU(       + [         R                  " S
S5      [        [         R                  " SS5      5      SUS9$ )   从环境变量加载配置	FLASK_ENVr   r   FLASK_USE_RELOADERfalsetrueF
SECRET_KEYzdev-secret-key
FLASK_HOSTr   
FLASK_PORT5002T)r
   r   r   r   r   r   r   )osgetenvlowerint)clsenvis_prodr   s       r   from_envAppConfig.from_env)   s     ii]3% Zaryy!5w?EEG6Qfkyy/?@+<3RYY|V45%
 	
r    N)r   r   )__name__
__module____qualname____firstlineno____doc__str__annotations__r   r   boolr   r   r-   r   r   propertyr   r   classmethodr1   __static_attributes__r3   r   r   r   r      s    O$K$E4D#D#HdL$0t 0 0 1 1 1 
 
r   r   c                       \ rS rSr% SrSr\\S'   Sr\\S'   Sr	\
\S'   S	r\\S
'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\   \S'   \S\SS 4S j5       rS\S\4S jrSrg)DatabaseConfig>   u   数据库配置
postgresqltype	localhostr   i8  r   ctfdatabasepostgresuser passwordctf.dbsqlite_db_nameNinstance_pathbase_dirr   c                    [         R                  " SS5      nUS:X  a}  U " S[         R                  " SS5      [        [         R                  " SS5      5      [         R                  " SS5      [         R                  " S	S
5      [         R                  " SS5      S9$ [         R                  R	                  US5      nU " S[         R                  " SS5      US9$ )r!   DATABASE_TYPErB   POSTGRES_HOSTrD   POSTGRES_PORT5432POSTGRES_DBrE   POSTGRES_USERrG   POSTGRES_PASSWORD123456)rC   r   r   rF   rH   rJ   instancesqliteSQLITE_DB_NAMErK   )rC   rL   rM   )r*   r+   r-   pathjoin)r.   rN   db_typerM   s       r   r1   DatabaseConfig.from_envJ   s     ))O\:l"!YY<?F;<=%8YY
;#6A  GGLL:>M!yy)98D+ r   c                    U R                   S:X  aZ  SSKJn  U" U R                  5      nU" U R                  5      nSU SU SU R
                   SU R                   SU R                   S3$ U R                  (       d%  [        R                  R                  US	5      U l        [        R                  " U R                  S
S9  [        R                  R                  U R                  U R                  5      nSU 3$ )u   获取数据库连接URIrB   r   )
quote_pluszpostgresql://:@/z?client_encoding=utf8rX   T)exist_okz
sqlite:///)rC   urllib.parser`   rH   rJ   r   r   rF   rM   r*   r[   r\   makedirsrL   )r   rN   r`   encoded_userencoded_passworddb_paths         r   get_database_uriDatabaseConfig.get_database_uri`   s    99$/%dii0L)$--8"<.2B1C1TYYKqQUQZQZP[[\]a]j]j\k  lA  B  B%%%'WW\\(J%G"KK**T:ggll4#5#5t7J7JKGy))r   )rM   )r4   r5   r6   r7   r8   rC   r9   r:   r   r   r-   rF   rH   rJ   rL   rM   r   r=   r1   rj   r>   r3   r   r   r@   r@   >   s    D#D#D#HcD#Hc"NC"#'M8C=' (8  ** * *r   r@   c                   t    \ rS rSr% SrSr\\S'   Sr\\S'   Sr	\
\   \S'   S	r\\S
'   \S\SS 4S j5       rSrg)LoggingConfigo   u   日志配置INFOlevel1%(asctime)s [%(levelname)s] %(name)s: %(message)sformatNfileTconsoler   r   c                 <    US:H  nU(       a	  U " SSSSS9$ U " SSS	S
9$ )r!   r   WARNINGz'%(asctime)s [%(levelname)s] %(message)szlogs/production.logF)rp   rr   rs   rt   ro   rq   T)rp   rr   rt   r3   )r.   r   r0   s      r   r1   LoggingConfig.from_envw   sB     -@*	  J r   r3   )r4   r5   r6   r7   r8   rp   r9   r:   rr   rs   r   rt   r;   r=   r1   r>   r3   r   r   rm   rm   o   sQ    E3EFCED(3-GT3 ?  r   rm   c                   f    \ rS rSr% SrSr\\S'   Sr\	\   \S'   Sr
\\S'   \S	\S
S 4S j5       rSrg)SessionConfig   u   会话配置
filesystemrC   Nfile_dir  permanent_lifetimerN   r   c                 N    U " S[         R                  R                  US5      SS9$ )r!   r{   flask_sessionr}   )rC   r|   r~   )r*   r[   r\   )r.   rN   s     r   r1   SessionConfig.from_env   s)     WW\\(O<#
 	
r   r3   )r4   r5   r6   r7   r8   rC   r9   r:   r|   r   r~   r-   r=   r1   r>   r3   r   r   ry   ry      sH    D#"Hhsm"""
 
 
 
r   ry   c                   r    \ rS rSr% Sr\\S'   \\S'   \\S'   \	\S'   \
\S'   \SS\\
   S	S 4S
 jj5       rSrg)SystemConfig   u!   系统配置（统一配置类）apprF   loggingsessionrN   Nr   c                    Uc]  [         R                  R                  [         R                  R                  [         R                  R                  [        5      5      5      n[
        R                  5       n[        R                  U5      n[        R                  UR                  5      n[        R                  U5      nU " UUUUUS9$ )u   加载所有配置)r   rF   r   r   rN   )r*   r[   abspathdirname__file__r   r1   r@   rm   r   ry   )r.   rN   
app_configdatabase_configlogging_configsession_configs         r   loadSystemConfig.load   s     wwrwwrwwx7P'QRH'')
(11(;&//
0F0FG&//9$""
 	
r   r3   )N)r4   r5   r6   r7   r8   r   r:   r@   rm   ry   r9   r=   r   r   r>   r3   r   r   r   r      sE    +	NM
HSM 
^ 
 
r   r   )r8   dataclassesr   r   typingr   r*   dotenvr   	Exceptionr   r@   rm   ry   r   r3   r   r   <module>r      s   
 )  	 	M &
 &
 &
R -* -* -*`   6 
 
 
  
 
 
]  		s   A/ /A87A8