рдЕрдЬрдЧрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред рд╕рднреА рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдиреЗ .yaml , рдХрд┐рд╕реА рдиреЗ .ini , рдФрд░ рдХрд┐рд╕реА рдиреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╕реЛрдЪрддреЗ рд╣реБрдП рдХрд┐ "Django рдкрд╛рде" рдХреЛ рдЕрдкрдиреА settings.py рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд┐рдпрд╛ рд╣реИред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдкрд╛рдпрдерди рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛) рддрд░реАрдХреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЦреИрд░, рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ :)


рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 1


рдХреЛрдб рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЦреИрд░, рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдирдИ рднрд╛рд╖рд╛рдПрдБ рдирд╣реАрдВ рд╕реАрдЦрдиреА рд╣реИрдВред рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХрд╛рдлреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХред


рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдиреНрдпрд╛рд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 # settings.py TWITTER_USERNAME="johndoe" TWITTER_PASSWORD="johndoespassword" TWITTER_TOKEN="......." 

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреА рдЪрд┐рдВрддрд╛ рд╣реИ, рд╕реБрд░рдХреНрд╖рд╛ рдбреЗрдЯрд╛ рдХреЛрдб рдореЗрдВ рдХреНрдпреЛрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ? рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдкрд╣реЗрд▓реАред рд╕рд┐рд╡рд╛рдп рд╣рдорд╛рд░реА рдлрд╛рдЗрд▓ рдХреЛ .gitignore рдореЗрдВ .gitignore рдХрд░рдиреЗ рдХреЗ, рд▓реЗрдХрд┐рди рдпрд╣, рдмрд┐рд▓реНрдХреБрд▓, рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред


рд╡реИрд╕реЗ рднреА, рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛрдб рдореЗрдВ рдХреНрдпреЛрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдб рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдХреЛрдб рднреА рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВред рдЙрд╕реА Django рдореЗрдВред рд╣рд░ рдХреЛрдИ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рдХрд╣реЗрдВрдЧреЗред рдЕрдлрд╝рд╕реЛрд╕ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред


рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ ред


рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 2


рдЦреИрд░, рдЬрдм рд╕реЗ рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреЛрдб рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЪрд▓реЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, toml рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИред


рд▓реЗрдХрд┐рди рд╣рдо рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдкрд╛рдпрдерди рдЦреБрдж рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - .ini рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ configparser рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред


рд╣рдорд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛:


 # settings.ini [Twitter] username="johndoe" password="johndoespassword" token="....." 

рдЕрдм рдкрд╛рдпрдерди рдореЗрдВ рдкрдврд╝реЗрдВ:


 import configparser #   config = configparser.ConfigParser() #    config.read("settings.ini") #   print(config["Twitter"]["username"]) #     ! # 'johndoe' 

рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ, рдкрд╣реБрдВрдЪ рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди ... рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ рдЕрдиреНрдп yaml рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рд╡рд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ json рдпрд╛ yaml ред рдмреЗрд╢рдХ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ pyyaml рдореЗрдВ json рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ) рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред


рдкреНрд░рд▓реЗрдЦрди ред


рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 3


рдФрд░ рдЕрдм, рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЕрдкрдиреЗ рджреБрдЦ рдХреЛ рдХрдо рдХрд░реЗрдВ :))ред


рдЗрд╕реЗ betterconf рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ PyPi рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред


рд╕реНрдерд╛рдкрдирд╛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд░рд╣ рд╕рд░рд▓ рд╣реИ:


 pip install betterconf 

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдорд╛рд░реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 # settings.py from betterconf import Config, field class TwitterConfig(Config): #  ,    `Config` username = field("TWITTER_USERNAME", default="johndoe") #   `username`,    ,   password = field("TWITTER_PASSWORD", default="johndoespassword") #  token = field("TWITTER_TOKEN", default=lambda: raise RuntimeError("Account's token must be defined!") #   ,      cfg = TwitterConfig() print(cfg.username) # 'johndoe' 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗ рдорд╛рди рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 from betterconf import Config, field from betterconf.config import AbstractProvider import json class JSONProvider(AbstractProvider): #     SETTINGS_JSON_FILE = "settings.json" #      def __init__(self): with open(self.SETTINGS_JSON_FILE, "r") as f: self._settings = json.load(f) #    def get(self, name): return self._settings.get(name) #    -  ,  - None.     ,   None. provider = JSONProvider() class TwitterConfig(Config): username = field("twitter_username", provider=provider) #      # ... cfg = TwitterConfig() # ... 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдпрд╣ рдирд┐рдореНрди рд╣реИ рдХрд┐ рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА-рдХрднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВред


рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреВрд▓рд┐рдпрди рдорд╛рди рдпрд╛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрдВрддрддрдГ рддрд╛рд░ рдореЗрдВ рдЖрдПрдВрдЧреЗред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╛рдп рд╣реИ:


 from betterconf import Config, field #     2  from betterconf.caster import to_bool, to_int class TwitterConfig(Config): # ... post_tweets = field("TWITTER_POST_TWEETS", caster=to_bool) # ... 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╕рднреА рдореВрд▓реНрдп (рдЕрд░реНрдерд╛рддреН true рдФрд░ false рдХреЛ рдкрд╛рдпрдерди bool рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдорд╛рдорд▓рд╛ рдХреЗрд╕-рд╕рдВрд╡реЗрджреА рдирд╣реАрдВ рд╣реИред


рдЕрдкрдирд╛ рдврд▓рд╛рдИрдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИ:


 from betterconf.caster import AbstractCaster class DashToDotCaster(AbstractCaster): def cast(self, val): return val.replace("-", ".") #     to_dot = DashToDotCaster() # ... 

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде Github рднрдВрдбрд╛рд░ ред


рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдЦреИрд░, рдФрд░ рдЖрдк рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА (рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ :)) рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдореБрд▓рд╛рдХрд╛рдд рдХреАред


рдкреБрдирд╢реНрдЪ


рд╣рд╛рдВ, рдЖрдк Pydantic рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣рд▓реНрдХрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi485236/


All Articles