рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред рд╕рднреА рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдиреЗ .yaml
, рдХрд┐рд╕реА рдиреЗ .ini
, рдФрд░ рдХрд┐рд╕реА рдиреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╕реЛрдЪрддреЗ рд╣реБрдП рдХрд┐ "Django рдкрд╛рде" рдХреЛ рдЕрдкрдиреА settings.py
рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд┐рдпрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдкрд╛рдпрдерди рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛) рддрд░реАрдХреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЦреИрд░, рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ :)
рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 1
рдХреЛрдб рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЦреИрд░, рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдирдИ рднрд╛рд╖рд╛рдПрдБ рдирд╣реАрдВ рд╕реАрдЦрдиреА рд╣реИрдВред рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХрд╛рдлреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХред
рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдиреНрдпрд╛рд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреА рдЪрд┐рдВрддрд╛ рд╣реИ, рд╕реБрд░рдХреНрд╖рд╛ рдбреЗрдЯрд╛ рдХреЛрдб рдореЗрдВ рдХреНрдпреЛрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ? рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдкрд╣реЗрд▓реАред рд╕рд┐рд╡рд╛рдп рд╣рдорд╛рд░реА рдлрд╛рдЗрд▓ рдХреЛ .gitignore
рдореЗрдВ .gitignore
рдХрд░рдиреЗ рдХреЗ, рд▓реЗрдХрд┐рди рдпрд╣, рдмрд┐рд▓реНрдХреБрд▓, рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред
рд╡реИрд╕реЗ рднреА, рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛрдб рдореЗрдВ рдХреНрдпреЛрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдб рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдХреЛрдб рднреА рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВред рдЙрд╕реА Django рдореЗрдВред рд╣рд░ рдХреЛрдИ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рдХрд╣реЗрдВрдЧреЗред рдЕрдлрд╝рд╕реЛрд╕ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ ред
рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 2
рдЦреИрд░, рдЬрдм рд╕реЗ рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреЛрдб рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЪрд▓реЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, toml
рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдо рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдкрд╛рдпрдерди рдЦреБрдж рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - .ini
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ configparser
рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред
рд╣рдорд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛:
# settings.ini [Twitter] username="johndoe" password="johndoespassword" token="....."
рдЕрдм рдкрд╛рдпрдерди рдореЗрдВ рдкрдврд╝реЗрдВ:
import configparser
рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ, рдкрд╣реБрдВрдЪ рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди ... рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ рдЕрдиреНрдп yaml
рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рд╡рд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ json
рдпрд╛ yaml
ред рдмреЗрд╢рдХ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ pyyaml
рдореЗрдВ json
рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ) рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдкреНрд░рд▓реЗрдЦрди ред
рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 3
рдФрд░ рдЕрдм, рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рджреБрдЦ рдХреЛ рдХрдо рдХрд░реЗрдВ :))ред
рдЗрд╕реЗ betterconf
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ PyPi рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рд╕реНрдерд╛рдкрдирд╛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд░рд╣ рд╕рд░рд▓ рд╣реИ:
pip install betterconf
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдорд╛рд░реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗ рдорд╛рди рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
from betterconf import Config, field from betterconf.config import AbstractProvider import json class JSONProvider(AbstractProvider):
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдпрд╣ рдирд┐рдореНрди рд╣реИ рдХрд┐ рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА-рдХрднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВред
рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреВрд▓рд┐рдпрди рдорд╛рди рдпрд╛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрдВрддрддрдГ рддрд╛рд░ рдореЗрдВ рдЖрдПрдВрдЧреЗред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╛рдп рд╣реИ:
from betterconf import Config, field
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╕рднреА рдореВрд▓реНрдп (рдЕрд░реНрдерд╛рддреН true
рдФрд░ false
рдХреЛ рдкрд╛рдпрдерди bool
рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдорд╛рдорд▓рд╛ рдХреЗрд╕-рд╕рдВрд╡реЗрджреА рдирд╣реАрдВ рд╣реИред
рдЕрдкрдирд╛ рдврд▓рд╛рдИрдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИ:
from betterconf.caster import AbstractCaster class DashToDotCaster(AbstractCaster): def cast(self, val): return val.replace("-", ".")
рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде Github рднрдВрдбрд╛рд░ ред
рдкрд░рд┐рдгрд╛рдо
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдЦреИрд░, рдФрд░ рдЖрдк рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА (рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ :)) рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдореБрд▓рд╛рдХрд╛рдд рдХреАред
рдкреБрдирд╢реНрдЪ
рд╣рд╛рдВ, рдЖрдк Pydantic
рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣рд▓реНрдХрд╛ рд╣реИред