เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตเดฑเต† เด…เด•เดคเตเดคเตเด‚ เดชเตเดฑเดคเตเดคเตเด‚ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป

เดžเดพเตป เด…เดŸเตเดคเตเดคเดฟเดŸเต† เดŽเดดเตเดคเดฟ เดกเต‹เด•เตเด•เดฑเดฟเดฒเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดฒเตˆเดซเดฟเดจเต†เดฏเตเด‚ เด…เดคเดฟเดจเต เดชเตเดฑเดคเตเดคเตเดณเตเดณ เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เด•เต‹เดกเดฟเดจเต†เดฏเตเด‚ เด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด‰เดคเตเดคเดฐเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเต เด…เดฆเตเดฆเต‡เดนเด‚ เดธเด‚เด•เตเดทเดฟเดชเตเดคเดฎเดพเดฏเดฟ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเต, เด…เดคเตเดตเดดเดฟ เด•เตเดฌเต‡เดฑเดฟเตฝ เดธเต‡เดตเดจเด‚ เดจเดจเตเดจเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดฐเดนเดธเตเดฏเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เดกเต‹เด•เตเด•เดฑเดฟเดจเต เดชเตเดฑเดคเตเดคเต เดชเต‹เดฒเตเด‚ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด’เดจเตเดจเตเด‚ เดคเดจเตเดจเต†เดฏเดฟเดฒเตเดฒ, เดŽเดจเตเดจเดพเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดš "เดชเดพเดšเด•เด•เตเด•เตเดฑเดฟเดชเตเดชเต" เด†เตผเด•เตเด•เต†เด™เตเด•เดฟเดฒเตเด‚ เด‰เดชเด•เดพเดฐเดชเตเดชเต†เดŸเตเดŸเต‡เด•เตเด•เดพเด‚ :) เด•เต‹เดกเต เดชเตˆเดคเตเดคเดฃเดฟเดฒเดพเดฃเต, เดชเด•เตเดทเต‡ เดฒเต‹เดœเดฟเด•เต เดญเดพเดทเดฏเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตเดฑเต† เด…เด•เดคเตเดคเตเด‚ เดชเตเดฑเดคเตเดคเตเด‚ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป

เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเดจเตเดฑเต† เดชเดถเตเดšเดพเดคเตเดคเดฒเด‚ เด‡เดคเดพเดฃเต: เด’เดฐเต เด•เดพเดฒเดคเตเดคเต เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด†เดฆเตเดฏเด‚ เด…เดคเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเด‚ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเด‚ เด‰เดณเตเดณ เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดฎเต‹เดฃเต‹เดฒเดฟเดคเตเดคเต เด†เดฏเดฟเดฐเตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เด•เดพเดฒเด•เตเดฐเดฎเต‡เดฃ เด…เดคเต เดตเดณเตผเดจเตเดจเต, เดธเต‡เดตเดจเด™เตเด™เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเดšเตเดšเต, เด…เดคเต เดฎเตˆเด•เตเดฐเต‹เดธเตผเดตเต€เดธเตเด•เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ. เดชเดฟเดจเตเดจเต† เดธเตเด•เต†เดฏเดฟเตฝ เดšเต†เดฏเตเดคเต. เด†เดฆเตเดฏเด‚, เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดจเด—เตเดจเดฎเดพเดฏ เดตเดฟเดชเดฟเดŽเดธเดฟเดฒเดพเดฃเต เดšเต†เดฏเตเดคเดคเต, เด•เต‹เดกเต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพ เด…เตปเดธเดฟเดฌเดฟเตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเตเดšเต†เดฏเตโ€Œเดคเต, เด•เต‚เดŸเดพเดคเต† เด“เดฐเต‹ เดธเต‡เดตเดจเดตเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฏ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เดณเตเด‚ เด•เต€เด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต YAML เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดฎเดพเดนเดฐเดฟเดšเตเดšเต, เด•เต‚เดŸเดพเดคเต† เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดฐเต เด•เต‹เตบเดซเดฟเด—เตผ เดซเดฏเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต. เดฒเต‹เด•เตเด•เตฝ เดฒเต‹เดžเตเดšเตเด•เตพ, เด…เดคเต เดตเดณเดฐเต† เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ .k เดˆ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด’เดฐเต เด†เด—เต‹เดณ เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดชเตเดฐเต‹เดœเด•เตโ€Œเดฑเตเดฑเดฟเตฝ เดŽเดตเดฟเดŸเต† เดจเดฟเดจเตเดจเตเด‚ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเดจเดพเด•เตเด‚.

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดฎเตˆเด•เตเดฐเต‹เดธเตผเดตเต€เดธเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚, เด…เดตเดฏเตเดŸเต† เด•เดฃเด•เตเดทเดจเตเด•เตพ, เด•เต‚เดŸเดพเดคเต† เด•เต‡เดจเตเดฆเตเดฐเต€เด•เตƒเดค เดฒเต‹เด—เดฟเด‚เด—เตเด‚ เดจเดฟเดฐเต€เด•เตเดทเดฃเดตเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด•เตเดฌเต‡เดฐเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดจเต€เด•เตเด•เดคเตเดคเต† เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เด•เดพเดฃเดฟเดšเตเดšเต, เด…เดคเต เด‡เดชเตเดชเต‹เดดเตเด‚ เดชเตเดฐเต‹เด—เดฎเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต. เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดš เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเดนเดพเดฏเดคเตเดคเต‹เดŸเตŠเดชเตเดชเด‚, เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเต เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เดฎเดพเดจเต‡เดœเตเดฎเต†เดจเตเดฑเดฟเดจเตเดณเตเดณ เด…เดคเดฟเดจเตเดฑเต† เดธเดฎเต€เดชเดจเด™เตเด™เตพ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดฐเดนเดธเตเดฏเด™เตเด™เตพ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเดต ะธ เด…เดตเดฐเต‹เดŸเตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดตเดดเดฟเด•เตพ. เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด‚ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเตเด‚ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดตเตเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เด•เตเดทเดฐเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดชเดพเดชเดฎเดพเดฃเต! เดŽเดจเตเดจเดพเตฝ เด…เดคเต‡ เดธเดฎเดฏเด‚, เด•เต‹เตบเดซเดฟเด—เดฑเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดŽเดจเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต: เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดตเดฟเดตเดฟเดง เดฎเตˆเด•เตเดฐเต‹เดธเตผเดตเต€เดธเตเด•เดณเดฟเตฝ เด‡เดคเต เด’เดฐเต‡เดชเต‹เดฒเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดฐเดฃเตเดŸเดพเดฎเดคเดพเดฏเดฟ, เดฒเดณเดฟเดคเดฎเดพเดฏ เด’เดจเตเดจเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฒเต‹เด•เตเด•เตฝ เดฎเต†เดทเต€เดจเดฟเตฝ เด•เต‹เดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเตฝ.

เด‡เด•เตเด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด’เดฐเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดžเด™เตเด™เดณเตเดŸเต† เด•เตเดฒเดพเดธเดฟเด•เต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเดฟเดฒเตเด‚ เด•เตเดฌเต‡เดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฐเดนเดธเตเดฏเด™เตเด™เดณเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดทเตโ€Œเด•เตเด•เดฐเดฟเดšเตเดšเต. เดฎเต‚เดจเตเดจเดพเดฎเดคเตเดคเต† เดชเตˆเดคเตเดคเดฃเดฟเดจเตเดฑเต† เดญเดพเดทเดฏเดฟเตฝ, เด•เต‚เดŸเตเดคเตฝ เด•เตผเด•เตเด•เดถเดฎเดพเดฏ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด˜เดŸเดจเดฏเตเด‚ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต:

เดกเดฟเด•เตเดฑเตเดฑเต[str, Dict[str, Union[str, int, float]]]

เด…เดคเดพเดฏเดคเต, เด…เดจเตเดคเดฟเดฎ เด•เต‹เด—เตเดซเดฟเด—เต เดŽเดจเตเดจเดคเต เดชเต‡เดฐเตเดณเตเดณ เดตเดฟเดญเดพเด—เด™เตเด™เดณเตเดณเตเดณ เด’เดฐเต เดจเดฟเด˜เดฃเตเดŸเตเดตเดพเดฃเต, เด…เดต เด“เดฐเต‹เดจเตเดจเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฏ เดคเดฐเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเดณเตเดณ เด’เดฐเต เดจเดฟเด˜เดฃเตเดŸเตเดตเดพเดฃเต. เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด‚ เดชเตเดฐเดตเต‡เดถเดจเดตเตเด‚ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เดณเตเดŸเต† เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เดคเตเดคเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚:

adminka:
  django_secret: "ExtraLongAndHardCode"

db_main:
  engine: mysql
  host: 256.128.64.32
  user: cool_user
  password: "SuperHardPassword"

redis:
  host: 256.128.64.32
  pw: "SuperHardPassword"
  port: 26379

smtp:
  server: smtp.gmail.com
  port: 465
  email: [email protected]
  pw: "SuperHardPassword"

เด…เดคเต‡ เดธเดฎเดฏเด‚ เดตเดฏเดฒเตเด‚ engine เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เตพ SQLite-เตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด•เต‚เดŸเดพเดคเต† redis เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดคเต mock, เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดซเดฏเดฒเดฟเดจเตเดฑเต† เดชเต‡เดฐเตเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต - เดˆ เดชเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดถเดฐเดฟเดฏเดพเดฏเดฟ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตเด•เดฏเตเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด‡เดคเต เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต, เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต, เดฎเดฑเตเดฑเต เด†เดตเดถเตเดฏเด™เตเด™เตพ เดŽเดจเตเดจเดฟเดตเดฏเตเด•เตเด•เดพเดฏเดฟ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เด•เต‹เดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดณเตเดชเตเดชเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดฎเดฑเตเดฑเต เดจเดฟเดฐเดตเดงเดฟ เด†เดตเดถเตเดฏเด™เตเด™เดณเตเดณเตเดณเดคเดฟเดจเดพเตฝ เด‡เดคเต เดžเด™เตเด™เตพเด•เตเด•เต เดตเดณเดฐเต† เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต - เดžเด™เตเด™เดณเตเดŸเต† เด•เต‹เดกเดฟเดจเตเดฑเต† เด’เดฐเต เดญเดพเด—เด‚ เดตเดฟเดตเดฟเดง เดตเดฟเดถเด•เดฒเดจ เด•เดฃเด•เตเด•เตเด•เต‚เดŸเตเดŸเดฒเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด‰เดฆเตเดฆเต‡เดถเดฟเดšเตเดšเตเดณเตเดณเดคเดพเดฃเต, เด‡เดคเต เด“เตผเด•เตเด•เดธเตเดŸเตเดฐเต‡เดทเดจเตเดณเตเดณ เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดตเดฟเดตเดฟเดง เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เต‡เดฃเตเดŸ เด…เดจเดฒเดฟเดธเตเดฑเตเดฑเตเด•เดณเตเดŸเต† เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเตเด•เดณเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. เดฌเดพเด•เตเด•เต†เตปเดกเต เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเต† เด†เดถเด™เตเด•เดชเตเดชเต†เดŸเตเดคเตเดคเดพเดคเต† เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เดกเดพเดฑเตเดฑ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดชเตˆเดชเตเดชเตเดฒเตˆเดจเตเด•เตพ เดกเต€เดฌเด—เต เดšเต†เดฏเตเดฏเตเด•. เดตเดดเดฟเดฏเดฟเตฝ, เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดฒเต‡เด”เดŸเตเดŸเต เด•เต‹เดกเต เด‰เตพเดชเตเดชเต†เดŸเต†เดฏเตเดณเตเดณ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดงเดพเดจ เดŸเต‚เดณเตเด•เตพ เด‡เดคเดฟเดฒเต‚เดŸเต†เดฏเดพเดฃเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดชเด™เตเด•เดฟเดŸเตเดจเตเดจเดคเต เด‰เดชเดฆเตเดฐเดตเดฟเด•เตเด•เดฟเดฒเตเดฒ. setup.py - เด‡เดคเต เด’เดฐเตเดฎเดฟเดšเตเดšเต เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฐเต€เดคเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เดธเตเดตเดคเดจเตเดคเตเดฐเดฎเดพเดฏ เด’เดฐเตŠเดฑเตเดฑ เด†เดตเดพเดธเดตเตเดฏเดตเดธเตเดฅเดฏเดพเดฏเดฟ เดžเด™เตเด™เดณเตเดŸเต† เด•เต‹เดกเดฟเดจเต† เด’เดจเตเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดชเต‹เดกเดฟเดจเตเดฑเต† เดตเดฟเดตเดฐเดฃเด‚ เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

containers:
  - name : enter-api
    image: enter-api:latest
    ports:
      - containerPort: 80
    volumeMounts:
      - name: db-main-secret-volume
        mountPath: /etc/secrets/db-main

volumes:
  - name: db-main-secret-volume
    secret:
      secretName: db-main-secret

เด…เดคเดพเดฏเดคเต, เด“เดฐเต‹ เดฐเดนเดธเตเดฏเดตเตเด‚ เด“เดฐเต‹ เดตเดฟเดญเดพเด—เดคเตเดคเต† เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดฐเดนเดธเตเดฏเด™เตเด™เตพ เด‡เดคเตเดชเต‹เดฒเต†เดฏเดพเดฃเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต:

apiVersion: v1
kind: Secret
metadata:
  name: db-main-secret
type: Opaque
stringData:
  db_main.yaml: |
    engine: sqlite
    filename: main.sqlite3

เด‡เดคเต เด’เดฐเตเดฎเดฟเดšเตเดšเต เดชเดพเดคเดฏเดฟเตฝ YAML เดซเดฏเดฒเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต /etc/secrets/db-main/section_name.yaml

เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดฒเต‹เดžเตเดšเตเด•เตพเด•เตเด•เดพเดฏเดฟ, เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดฑเต‚เดŸเตเดŸเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเดฒเต‹ เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เดชเดพเดคเดฏเดฟเดฒเต‹ เดธเตเดฅเดฟเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดˆ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพเด•เตเด•เต เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฏ เด•เต‹เดกเต เดธเตโ€Œเดชเต‹เดฏเดฟเดฒเดฑเดฟเตฝ เด•เดพเดฃเดพเด‚.

config.py

__author__ = 'AivanF'
__copyright__ = 'Copyright 2020, AivanF'

import os
import yaml

__all__ = ['config']
PROJECT_DIR = os.path.abspath(__file__ + 3 * '/..')
SECRETS_DIR = '/etc/secrets'
KEY_LOG = '_config_log'
KEY_DBG = 'debug'

def is_yes(value):
    if isinstance(value, str):
        value = value.lower()
        if value in ('1', 'on', 'yes', 'true'):
            return True
    else:
        if value in (1, True):
            return True
    return False

def update_config_part(config, key, data):
    if key not in config:
        config[key] = data
    else:
        config[key].update(data)

def parse_big_config(config, filename):
    '''
    Parse YAML config with multiple section
    '''
    if not os.path.isfile(filename):
        return False
    with open(filename) as f:
        config_new = yaml.safe_load(f.read())
        for key, data in config_new.items():
            update_config_part(config, key, data)
        config[KEY_LOG].append(filename)
        return True

def parse_tiny_config(config, key, filename):
    '''
    Parse YAML config with a single section
    '''
    with open(filename) as f:
        config_tiny = yaml.safe_load(f.read())
        update_config_part(config, key, config_tiny)
        config[KEY_LOG].append(filename)

def combine_config():
    config = {
        # To debug config load code
        KEY_LOG: [],
        # To debug other code
        KEY_DBG: is_yes(os.environ.get('DEBUG')),
    }
    # For simple local runs
    CONFIG_SIMPLE = os.path.join(PROJECT_DIR, 'config.yaml')
    parse_big_config(config, CONFIG_SIMPLE)
    # For container's tests
    CONFIG_ENVVAR = os.environ.get('CONFIG')
    if CONFIG_ENVVAR is not None:
        if not parse_big_config(config, CONFIG_ENVVAR):
            raise ValueError(
                f'No config file from EnvVar:n'
                f'{CONFIG_ENVVAR}'
            )
    # For K8s secrets
    for path, dirs, files in os.walk(SECRETS_DIR):
        depth = path[len(SECRETS_DIR):].count(os.sep)
        if depth > 1:
            continue
        for file in files:
            if file.endswith('.yaml'):
                filename = os.path.join(path, file)
                key = file.rsplit('.', 1)[0]
                parse_tiny_config(config, key, filename)
    return config

def build_config():
    config = combine_config()
    # Preprocess
    for key, data in config.items():
        if key.startswith('db_'):
            if data['engine'] == 'sqlite':
                data['filename'] = os.path.join(PROJECT_DIR, data['filename'])
    # To verify correctness
    if config[KEY_DBG]:
        print(f'** Loaded config:n{yaml.dump(config)}')
    else:
        print(f'** Loaded config from: {config[KEY_LOG]}')
    return config

config = build_config()

เด‡เดตเดฟเดŸเต† เดฏเตเด•เตเดคเดฟ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต: เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดตเดฒเดฟเดฏ เด•เต‹เตบเดซเดฟเด—เต‡เดทเดจเตเด•เดณเตเด‚ เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เดตเดดเดฟเดฏเตเดณเตเดณ เดชเดพเดคเด•เดณเตเด‚, เด•เตเดฌเตผ เดฐเดนเดธเตเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดšเต†เดฑเดฟเดฏ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดตเดฟเดญเดพเด—เด™เตเด™เดณเตเด‚ เดžเด™เตเด™เตพ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เดคเตเดŸเตผเดจเตเดจเต เด…เดต เด…เตฝเดชเตเดชเด‚ เดฎเตเตปเด•เต‚เดŸเตเดŸเดฟ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด•เต‚เดŸเดพเดคเต† เดšเดฟเดฒ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ. เดฐเดนเดธเตเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดซเดฏเดฒเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดคเดฟเดฐเดฏเตเดฎเตเดชเต‹เตพ, เด’เดฐเต เดกเต†เดชเตเดคเต เดชเดฐเดฟเดฎเดฟเดคเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดžเดพเตป เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เดฐเดนเดธเตเดฏเด™เตเด™เตพ เดธเตเดตเดฏเด‚ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด“เดฐเต‹ เดฐเดนเดธเตเดฏเดคเตเดคเดฟเดฒเตเด‚ K8s เด’เดฐเต เดฎเดฑเดžเตเดžเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดซเต‹เตพเดกเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดฒเดฟเด™เตเด•เต เด‰เดฏเตผเดจเตเดจ เดคเดฒเดคเตเดคเดฟเตฝ เดธเตเดฅเดฟเดคเดฟเดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด†เตผเด•เตเด•เต†เด™เตเด•เดฟเดฒเตเด‚ เด‰เดชเด•เดพเดฐเดชเตเดชเต†เดŸเตเดฎเต†เดจเตเดจเต เดžเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต :) เดธเตเดฐเด•เตเดทเดฏเต† เด•เตเดฑเดฟเดšเตเดšเต‹ เดฎเดฑเตเดฑเต เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดฒเดฟเดจเตเดณเตเดณ เดฎเดฑเตเดฑเต เดฎเต‡เด–เดฒเด•เดณเต† เด•เตเดฑเดฟเดšเตเดšเต‹ เด‰เดณเตเดณ เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเตเด‚ เดถเตเดชเดพเตผเดถเด•เดณเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด•เดฎเตเดฎเตเดฏเต‚เดฃเดฟเดฑเตเดฑเดฟเดฏเตเดŸเต† เด…เดญเดฟเดชเตเดฐเดพเดฏเดตเตเด‚ เดฐเดธเด•เดฐเดฎเดพเดฃเต, เด•เต‹เตบเดซเดฟเด—เตเดฎเดพเดชเตโ€Œเดธเดฟเดจเต (เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เด‡เดคเตเดตเดฐเต† เด…เดต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ) เดชเดฟเดจเตเดคเตเดฃ เดšเต‡เตผเดคเตเดคเต GitHub / PyPI-เดฏเดฟเตฝ เด•เต‹เดกเต เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฎเต‚เดฒเตเดฏเดตเดคเตเดคเดพเดฃเต‹? เดตเตเดฏเด•เตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ, เด…เดคเตเดคเดฐเด‚ เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เต เดธเดพเตผเดตเดคเตเดฐเดฟเด•เดฎเดพเด•เดพเตป เด•เดดเดฟเดฏเดพเดคเตเดคเดตเดฟเดงเด‚ เดตเตเดฏเด•เตเดคเดฟเด—เดคเดฎเดพเดฃเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด‡เดตเดฟเดŸเต† เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเต‹เดฒเต† เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเตเดŸเต† เดจเดฟเตผเดตเตเดตเดนเดฃเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เด…เตฝเดชเตเดชเด‚ เดจเต‹เด•เตเด•เตเด•, เด•เต‚เดŸเดพเดคเต† เดธเต‚เด•เตเดทเตเดฎเดคเด•เตพ, เดจเตเดฑเตเด™เตเด™เตเด•เตพ, เดฎเดฟเด•เดšเตเดš เดธเดฎเตเดชเตเดฐเดฆเดพเดฏเด™เตเด™เตพ เดŽเดจเตเดจเดฟเดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดšเตผเดšเตเดš, เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเดฟเตฝ เด•เดพเดฃเดพเตป เดžเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต. , เดฎเดคเดฟ ๐Ÿ˜‰

เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดค เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เดฎเดพเดคเตเดฐเดฎเต‡ เดธเตผเดตเต‡เดฏเดฟเตฝ เดชเด™เตเด•เต†เดŸเตเด•เตเด•เดพเตป เด•เดดเดฟเดฏเต‚. เดธเตˆเตป เด‡เตปเดฆเดฏเดตเดพเดฏเดฟ.

เดžเดพเตป เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต/เดฒเตˆเดฌเตเดฐเดฑเดฟ เด†เดฏเดฟ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เดฃเต‹?

  • 0,0%เด…เดคเต†, เดžเดพเตป /contribution0 เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚

  • 33,3%เด…เดคเต†, เด…เดคเต เดฎเดฟเด•เดšเตเดšเดคเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเดจเตเดจเต4

  • 41,7%เด‡เดฒเตเดฒ, เด†เดฐเดพเดฃเต เด…เดคเต เด…เดตเดฐเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เด…เดตเดฐเตเดŸเต† เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเด•เตเด•เต‡เดฃเตเดŸเดคเต5

  • 25,0%เดžเดพเตป เด‰เดคเตเดคเดฐเด‚ เดชเดฑเดฏเตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดฟเดŸเตเดŸเตเดจเดฟเตฝเด•เตเด•เตเด‚3

12 เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพ เดตเต‹เดŸเตเดŸเต เดšเต†เดฏเตเดคเต. 3 เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพ เดตเดฟเดŸเตเดŸเตเดจเดฟเดจเตเดจเต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•