เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ…เจคเฉ‡ เจฌเจพเจนเจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเฉฐเจฐเจšเจจเจพ

เจฎเฉˆเจ‚ เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจนเฉˆ เจกเฉŒเจ•เจฐ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจœเฉ€เจตเจจ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฌเจพเจนเจฐ เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจ•เฉ‹เจก เจฌเจพเจฐเฉ‡ เจœเจตเจพเจฌ, เจœเจฟเฉฑเจฅเฉ‡ เจ‰เจธเจจเฉ‡ เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš เจฆเฉฑเจธเจฟเจ† เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจ–เฉเจฆ เจฆเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจชเฉเจฐเจฃเจพเจฒเฉ€ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจœเฉ‹ เจ•เฉเจฌเฉ‡เจฐ เจตเจฟเฉฑเจš เจธเฉ‡เจตเจพ เจšเฉฐเจ—เฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉฐเจฎ เจ•เจฐเฉ‡, เจญเฉ‡เจฆ เจ–เฉ‹เจฒเฉเจนเฉ‡, เจ…เจคเฉ‡ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจšเฉฑเจฒเฉ‡, เจ‡เฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจฟ เจกเฉŒเจ•เจฐ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจตเฉ€เฅค เจ•เฉเจ เจตเฉ€ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจตเจฐเจฃเจฟเจค "เจตเจฟเจ…เฉฐเจœเจจ" เจ•เจฟเจธเฉ‡ เจฒเจˆ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ :) เจ•เฉ‹เจก เจชเจพเจˆเจฅเจจ เจตเจฟเฉฑเจš เจนเฉˆ, เจชเจฐ เจคเจฐเจ• เจญเจพเจธเจผเจพ เจจเจพเจฒ เจจเจนเฉ€เจ‚ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ…เจคเฉ‡ เจฌเจพเจนเจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเฉฐเจฐเจšเจจเจพ

เจธเจตเจพเจฒ เจฆเจพ เจชเจฟเจ›เฉ‹เจ•เฉœ เจ‡เจน เจนเฉˆ: เจ‡เฉฑเจ• เจธเจฎเฉ‡เจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจนเฉเฉฐเจฆเจพ เจธเฉ€, เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจน เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจตเจพเจฒเจพ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ เจฎเฉ‹เจจเฉ‹เจฒเฉ€เจฅ เจธเฉ€, เจชเจฐ เจธเจฎเฉ‡เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เจน เจตเจงเจฆเจพ เจ—เจฟเจ†, เจธเฉ‡เจตเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ†, เจœเฉ‹ เจฌเจฆเจฒเฉ‡ เจตเจฟเฉฑเจš เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจธเจฐเจตเจฟเจธเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ†, เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเจ•เฉ‡เจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ†เฅค เจชเจนเจฟเจฒเจพเจ‚, เจ‡เจน เจธเจญ เจฌเฉ‡เจ…เจฐ VPS 'เจคเฉ‡ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ•เฉ‹เจก เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจคเฉˆเจจเจพเจค เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจœเจฟเจธ 'เจคเฉ‡ เจœเจตเจพเจฌเจฆเฉ‡เจนเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจตเฉˆเจšเจพเจฒเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจนเจฐเฉ‡เจ• เจธเฉ‡เจตเจพ เจจเฉ‚เฉฐ เจœเจผเจฐเฉ‚เจฐเฉ€ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจ…เจคเฉ‡ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• YAML เจธเฉฐเจฐเจšเจจเจพ เจจเจพเจฒ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเจฎเจพเจจ เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจฒเจˆ เจตเจฐเจคเฉ€ เจ—เจˆ เจธเฉ€เฅค เจธเจฅเจพเจจเจ• เจฒเจพเจ‚เจš, เจœเฉ‹ เจ•เจฟ เจฌเจนเฉเจค เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจธเฉ€, เจ•เจฟเจ‰เจ‚เจ•เจฟ .k เจ‡เจน เจธเฉฐเจฐเจšเจจเจพ เจ‡เฉฑเจ• เจ—เจฒเฉ‹เจฌเจฒ เจ†เจฌเจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ, เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจ•เจฟเจคเฉ‡ เจตเฉ€ เจชเจนเฉเฉฐเจšเจฏเฉ‹เจ— เจนเฉˆเฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจฟเฉฑเจš เจตเจพเจงเจพ, เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ, เจ…เจคเฉ‡ เจ•เฉ‡เจ‚เจฆเจฐเฉ€เจ•เฉเจฐเจฟเจค เจฒเฉŒเจ—เจฟเฉฐเจ— เจ…เจคเฉ‡ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ, เจจเฉ‡ เจ•เฉเจฌเฉ‡เจฐ เจฆเฉ‡ เจ‡เฉฑเจ• เจ•เจฆเจฎ เจฆเฉ€ เจชเฉ‚เจฐเจต-เจ…เจจเฉเจธเจผเจพเจธเจจ เจ•เฉ€เจคเฉ€, เจœเฉ‹ เจ…เจœเฉ‡ เจตเฉ€ เจœเจพเจฐเฉ€ เจนเฉˆเฅค เจœเจผเจฟเจ•เจฐ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจธเจนเจพเจ‡เจคเจพ เจฆเฉ‡ เจจเจพเจฒ, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจชเฉเจฐเจฌเฉฐเจงเจจ เจฒเจˆ เจ†เจชเจฃเฉ€เจ†เจ‚ เจชเจนเฉเฉฐเจšเจพเจ‚ เจฆเฉ€ เจชเฉ‡เจธเจผเจ•เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเจจ เจ…เจ–เฉŒเจคเฉ€ เจฐเจพเจœเจผ ะธ เจ‰เจนเจจเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡. เจตเจฟเจงเฉ€ เจฎเจฟเจ†เจฐเฉ€ เจ…เจคเฉ‡ เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจพ เจ•เจฐเจจเจพ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจชเจพเจช เจนเฉˆ! เจชเจฐ เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ เจนเฉ€, เจฎเฉˆเจ‚ เจธเฉฐเจฐเจšเจจเจพ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ†เจชเจฃเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจซเจพเจฐเจฎเฉˆเจŸ เจจเฉ‚เฉฐ เจฌเจฐเจ•เจฐเจพเจฐ เจฐเฉฑเจ–เจฃเจพ เจšเจพเจนเจพเจ‚เจ—เจพ: เจชเจนเจฟเจฒเจพเจ‚, เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจฎเจพเจˆเจ•เจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฎเจพเจจ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ, เจ…เจคเฉ‡ เจฆเฉ‚เจœเจพ, เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจฅเจพเจจเจ• เจฎเจธเจผเฉ€เจจ 'เจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเจพเฅค เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจ‡เจฒ.

เจ‡เจธ เจธเจฌเฉฐเจง เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจ†เจฌเจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจธเจพเจกเฉ€ เจ•เจฒเจพเจธเจฟเจ• เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจ…เจคเฉ‡ เจ•เฉเจฌเฉ‡เจฐ เจฆเฉ‡ เจญเฉ‡เจฆ เจฆเฉ‹เจตเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจธเฉ‹เจงเจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจคเฉ€เจœเฉ‡ เจชเจพเจˆเจฅเจจ เจฆเฉ€ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจธเจ–เจผเจค เจธเฉฐเจฐเจšเจจเจพ เจขเจพเจ‚เจšเจพ เจตเฉ€ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ:

Dict[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 เจนเจฐเฉ‡เจ• เจ—เฉเจชเจค เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฒเฉเจ•เจฟเจ† เจนเฉ‹เจ‡เจ† เจซเฉ‹เจฒเจกเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจญเฉ‡เจฆ เจ†เจชเจฃเฉ‡ เจ†เจช เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจฒเจฟเฉฐเจ• เจ‰เฉฑเจš เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจธเจฅเจฟเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ.

เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจฎเฉ€เจฆ เจนเฉˆ เจ•เจฟ เจœเฉ‹ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ เจ‰เจน เจ•เจฟเจธเฉ‡ เจฒเจˆ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹เจตเฉ‡เจ—เจพ :) เจธเฉเจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚ เจธเฉเจงเจพเจฐ เจฒเจˆ เจนเฉ‹เจฐ เจ–เฉ‡เจคเจฐเจพเจ‚ เจฌเจพเจฐเฉ‡ เจ•เฉ‹เจˆ เจตเฉ€ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจธเจฟเจซเจผเจพเจฐเจธเจผเจพเจ‚ เจธเจตเฉ€เจ•เจพเจฐ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ•เจฎเจฟเจŠเจจเจฟเจŸเฉ€ เจฆเฉ€ เจฐเจพเจ เจตเฉ€ เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ, เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน ConfigMaps (เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ…เจœเฉ‡ เจคเฉฑเจ• เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ) เจฒเจˆ เจธเจฎเจฐเจฅเจจ เจœเฉ‹เฉœเจจเจพ เจ…เจคเฉ‡ GitHub / PyPI 'เจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉˆ? เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉˆเจ‚ เจธเฉ‹เจšเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจšเฉ€เจœเจผเจพเจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฒเจˆ เจธเจฐเจต เจตเจฟเจ†เจชเจ• เจนเฉ‹เจฃ เจฒเจˆ เจฌเจนเฉเจค เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจนเจจ, เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจฒเฉ‹เจ•เจพเจ‚ เจฆเฉ‡ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ 'เจคเฉ‡ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจเจพเจค เจฎเจพเจฐเจจเจพ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เฉฑเจฅเฉ‡ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ…เจคเฉ‡ เจธเฉ‚เจ–เจฎเจคเจพเจตเจพเจ‚, เจธเฉเจเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ€ เจšเจฐเจšเจพ, เจœเฉ‹ เจฎเฉˆเจ‚ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจฃ เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค , เจ•เจพเจซเฉ€ เจนเฉˆ ๐Ÿ˜‰

เจธเจฟเจฐเจซเจผ เจฐเจœเจฟเจธเจŸเจฐเจก เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจนเฉ€ เจธเจฐเจตเฉ‡เจ–เจฃ เจตเจฟเฉฑเจš เจนเจฟเฉฑเจธเจพ เจฒเฉˆ เจธเจ•เจฆเฉ‡ เจนเจจเฅค เจธเจพเจˆเจจ - เจ‡เจจ, เจคเฉเจนเจพเจกเจพ เจธเฉเจ†เจ—เจค เจนเฉˆ.

เจ•เฉ€ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ/เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจœเฉ‹เจ‚ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ?

  • 0,0%เจนเจพเจ‚, เจฎเฉˆเจ‚ /contribution0 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เจพ

  • 33,3%เจนเจพเจ‚, เจ‡เจน เจฌเจนเฉเจค เจตเจงเฉ€เจ† เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ 4

  • 41,7%เจจเจนเฉ€เจ‚, เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจ…เจคเฉ‡ เจ†เจชเจฃเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเจพเจ‚ เจฎเฉเจคเจพเจฌเจ• เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ5

  • 25,0%เจฎเฉˆเจ‚ เจœเจตเจพเจฌ เจฆเฉ‡เจฃ เจคเฉ‹เจ‚ เจชเจฐเจนเฉ‡เจœเจผ เจ•เจฐเจพเจ‚เจ—เจพ 3

12 เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‡ เจตเฉ‹เจŸ เจชเจพเจˆเฅค 3 เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจชเจฐเจนเฉ‡เจœเจผ เจฐเจนเฉ‡เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹