рдлреНрд▓рд╛рд╕реНрдХ-рдкреЛрд╢рди, рднрд╛рдЧ 0 рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдВрдЯреНрд░реЛрд▓ рд╕рд┐рд╕реНрдЯрдо: рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рддреИрдпрд╛рд░ рдХрд░рдирд╛

рдкрд░рд┐рдЪрдп


рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ, рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╕рдордп рд╕реЗ рдлреНрд▓рд╛рд╕реНрдХ-рдкреЙрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬрд┐рд╕рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рд╣реИрдВ: SQLAlchemy рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдХреАрдХрд░рдг, рдХреНрд░реВрдб рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреА рдСрдЯреЛ-рдЬреЗрдирд░реЗрд╢рди, рдкреЛрд╢рди-рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ (рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдпрджрд┐ рдЖрдк рдПрдХ рдПрдкреАрдЖрдИ рд╕реЗрд╡рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд╕реЗрд╡рд╛)ред


рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд░реВрд╕реА рдореЗрдВ рдлреНрд▓рд╛рд╕реНрдХ-рдкреЙрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реВрдкрд░реЗрдЦрд╛ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд╕рдХрддреА рд╣реИред


рдЗрд╕ рд░реВрдкрд░реЗрдЦрд╛ рдкрд░ рдПрдХ рд╕рд░рд▓ рд╕рдореАрдХреНрд╖рд╛ рд▓реЗрдЦ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдлреНрд▓рд╛рд╕реНрдХ-рдкреЛрд╢рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдлреБрд░рдлреБрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдкрд░ рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред


рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


  • рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ (isbn, рд╢реАрд░реНрд╖рдХ, рд╡рд┐рд╡рд░рдг, рд▓реЗрдЦрдХ, рдЖрджрд┐)
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ (рдкрд╛рдардХ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпрди)
  • рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдкреБрд╕реНрддрдХ рдЬрд╛рд░реА рдХрд░рдирд╛

рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


  • PostgreSQL
  • рдлреНрд▓рд╛рд╕реНрдХ, рдлреНрд▓рд╛рд╕реНрдХ-рдПрд╕рдХреНрдпреВрдПрд▓рдХреЗрдореА, рдлреНрд▓рд╛рд╕реНрдХ-рдЬреЗрдбрдбрдмреНрд▓реНрдпреВрдЯреА, рдлреНрд▓рд╛рд╕реНрдХ-рдкреЙрд╢рди, рдлреНрд▓рд╛рд╕реНрдХ-рдорд╛рдЗрдЧреНрд░реЗрдЯ

рдЯреНрд░реЗрдирд┐рдВрдЧ


рдХрдВрдХрд╛рд▓


рд╕реНрд╡рдпрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдВрдХрд╛рд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Valefor cookiecutter- рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


cookiecutter gh:lemegetonx/valefor 

рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рджреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


  1. рдРрдк рдореБрдЦреНрдп рдЪреАрдЬ рд╣реИред рдЗрд╕рдореЗрдВ jwt рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдлрдВрдХреНрд╢рди, рдкреЛрд╢рди рд░рд┐рд╕реЛрд░реНрд╕реЗрдЬ рдХреЗ рд▓рд┐рдП рдорд┐рдХреНрд╕рд┐рди рдХреНрд▓рд╛рд╕реЗрд╕ рдФрд░ sqlalchemy рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИред
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ - рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рд╣реЛрддрд╛ рд╣реИред

рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрдирд╛


рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╡рд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкрд╛рдЗрдк рднреА pyproject.toml рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╕рдВрдж рдЖрдкрдХреА рд╣реИред рдореИрдВ рдХрд╡рд┐рддрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдКрдВрдЧрд╛ред


 poetry install 

рд╡рд┐рдиреНрдпрд╛рд╕


рд╕рд░рд▓реАрдХреГрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдЗрдЯреНрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рд╕рд╛рдЗрдЯреНрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


  1. рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░ / рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреЛ рдмрджрд▓реЗрдВред рд╣рдо SystemCredentialProvider рдХреЛ YamlCredentialProvider рд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗ рддрд╛рдХрд┐ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдлрд╛рдЗрд▓, рдЬрд┐рд╕реЗ рд╣рдо рдХрдорд┐рдЯ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:

 from sitri import Sitri from sitri.contrib.yaml import YamlConfigProvider, YamlCredentialProvider configuration = Sitri( config_provider=YamlConfigProvider(yaml_path="./config.yaml"), credential_provider=YamlCredentialProvider(yaml_path="./credential.yaml"), ) 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкреАрдПрд╕ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдм рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдорд┐рд▓реЗрдЧрд╛ред


  1. рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкреНрд░рджрд╛рддрд╛ рдмрдирд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕_рдореЗрдВ рдбреЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде get_credential рдХреЙрд▓ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЛ рдмрджрд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

 DB_NAME = configuration.get_credential("db.name", path_mode=True) DB_HOST = configuration.get_credential("db.host", path_mode=True) DB_PASSWORD = configuration.get_credential("db.user.password", path_mode=True) DB_PORT = configuration.get_credential("db.port", path_mode=True) DB_USER = configuration.get_credential("db.user.name", path_mode=True) 

рддреЛ, config.yaml рдлрд╝рд╛рдЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдереА, рд▓реЗрдХрд┐рди рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ .yaml рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рдРрд╕реА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ .gitignore рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓.рдпрдореНрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд┐рд╕реА рдХреЛ рднреА рд╕рдордЭ рдореЗрдВ рдЖ рдЬрд╛рдП рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред


рдЖрдзрд╛рд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓


 db: name: furfur_db host: localhost port: 5432 user: password: passwd name: admin 

рдбреЗрдЯрд╛рдмреЗрд╕


рд╣рдорд╛рд░реА рддреИрдпрд╛рд░реА рдХрд╛ рдЕрдЧрд▓рд╛ рдЪрд░рдг DBMS рдХреА рддреИрдирд╛рддреА рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ PostgreSQLред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╕реНрдЯреИрдХ рдмрдирд╛рдКрдВрдЧрд╛ред рд╢реНрдпрд╛рдо рдлрд╛рдЗрд▓ рдЬрд╣рд╛рдВ рдореИрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИред


 version: '3.1' services: db: image: postgres restart: always environment: POSTGRES_PASSWORD: passwd POSTGRES_USER: admin POSTGRES_DB: furfur_db ports: - 5432:5432 

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, valefor рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JWT (рд╣реИрдВрдбрд▓рд░) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рдг рдорд╛рдЗрдЧреНрд░реЗрд╢рди (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛) рд╣реИред


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


 export FLASK_APP=furfur.app flask db init flask db migrate flask db upgrade 

рд╕рдм рдХреБрдЫ, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рддреИрдпрд╛рд░реА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЖрдзрд╛рд░, рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд░рд▓ рднреВрдорд┐рдХрд╛ рдкреНрд░рдгрд╛рд▓реА рдФрд░ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА: https://github.com/Egnod/furfur
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/Egnod/furfur/releases/tag/0.0.2

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


All Articles