Gunicorn: v20 рдореБрджреНрджрд╛: 'рдРрдк' рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ 'create_app ()' рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдирд╡ре░ 2019  ┬╖  47рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: benoitc/gunicorn

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

рдЧрдирд┐рдХреЛрд░реНрди рдХреЗ рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 19.9 рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред

рдпрд╣ рд╡рд╣ рдЖрджреЗрд╢ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдЕрдкрдирд╛ рдРрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

gunicorn 'app:create_app()' --workers 4 --threads 4 --bind 0.0.0.0:$PORT

рддреНрд░реБрдЯрд┐ рд╣реИ:

Failed to find application object 'create_app()' in 'app'
( Feedback Requested FeaturApp Investigation

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рддрдп рдкреИрдЪ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @davidism !

рд╕рдВрднрд╛рд▓реЗ рдЧрдП рд╕рднреА рдорд╛рдорд▓реЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣реИрдВ: https://github.com/benoitc/gunicorn/commit/19cb68f4c3b55da22581c008659ee62d8c54ab2b#diff -5832adf374920d75d4bf48e546367f53R67

рд╕рднреА 47 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рднреА рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд
Failed to find application object 'create_app()' in 'app'
рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 19.9.0 рдкрд░ рдкрд┐рди рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдореИрдВ рд╢реБрд░реВ рдореЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлрд┐рдХреНрд╕ рдХреЛ рдЧрдирд┐рдХреЛрд░реНрди рдХрдорд╛рдВрдб рд╕реЗ рдмрджрд▓рдирд╛ рдерд╛:
gunicorn --bind 0.0.0.0:$PORT app:create_app()
рдкреНрд░рддрд┐:
gunicorn --bind 0.0.0.0:$PORT app:create_app
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ create_app рдХреЗ рдмрд╛рдж рдХреЛрд╖реНрдардХ рдЕрдм рдЪрд▓реЗ рдЧрдП рд╣реИрдВ)ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╕рдм рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ:

рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | [реирежрезреп-резрез-резреж резреп:резрео:релрек +режрежрежреж] [рез] [рдЬрд╛рдирдХрд╛рд░реА] реиреж.реж.реж
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | [реирежрезреп-резрез-резреж резреп:резрео:релрек +режрежрежреж] [рез] [рд╕реВрдЪрдирд╛] рдпрд╣рд╛рдВ рд╕реБрди рд░рд╣рд╛ рд╣реИ: http://0.0.0.0 :8000 (1)
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | [реирежрезреп-резрез-резреж резреп:резрео:релрек +режрежрежреж] [рез] [рд╕реВрдЪрдирд╛] рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: рд╕рд┐рдВрдХ
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | [реирежрезреп-резрез-резреж резреп:резрео:релрек +режрежрежреж] [резрез] [рдЬрд╛рдирдХрд╛рд░реА] рдкреАрдЖрдИрдбреА тАЛтАЛрдХреЗ рд╕рд╛рде рдмреВрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛: резрез

рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдореГрдЧрддреГрд╖реНрдгрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк рдЕрдкрдиреА рдлреНрд▓рд╛рд╕реНрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ/рдПрдВрдбрдкреЙрдЗрдВрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рддреЛ рдпрд╣ рдХрд╣реЗрдЧрд╛:

[реирежрезреп-резрез-резреж резреп:реиреж:реирео +режрежрежреж] [резрез] [рддреНрд░реБрдЯрд┐] рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ /
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | рдЯреНрд░реЗрд╕рдмреИрдХ (рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдХреЙрд▓ рдЕрдВрддрд┐рдо):
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | рдлрд╝рд╛рдЗрд▓ "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", рд▓рд╛рдЗрди 134, рд╣реИрдВрдбрд▓ рдореЗрдВ
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | self.handle_request (рд╢реНрд░реЛрддрд╛, рдЕрдиреБрд░реЛрдз, рдЧреНрд░рд╛рд╣рдХ, addr)
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | рдлрд╝рд╛рдЗрд▓ "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", рд▓рд╛рдЗрди 175, рд╣реИрдВрдбрд▓_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ рдореЗрдВ
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | рд░реЗрд╕реНрдкрд┐рдЯрд░ = self.wsgi (рдкрд░реНрдпрд╛рд╡рд░рдг, resp.start_response)
рд╡реЗрдмрд╕рд╛рдЗрдЯ_1 | рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: create_app () 0 рд╕реНрдерд┐рддреАрдп рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди 2 рджрд┐рдП рдЧрдП рдереЗ

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрдирд┐рдХреЛрд░реНрди рд╕рдВрд╕реНрдХрд░рдг 20.0.0 рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдпрд╣ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: https://github.com/benoitc/gunicorn/commit/3701ad9f26a7a4c0a081dfd0f6e97ecb272de515#diff -0b90f794c3e9742c45bf484505e3db8dR377 #2043 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрдХреНрд╖ рдореЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ myapp = create_app() рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рджрд╕ app:myapp ред рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рд╡рд╣рд╛рдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред @berkerpeksag eval рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА?

рдпрд╣ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: 3701ad9#diff-0b90f794c3e9742c45bf484505e3db8dR377 #2043 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрдХреНрд╖ рдореЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ myapp = create_app() рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рджрд╕ app:myapp ред рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рд╡рд╣рд╛рдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред @berkerpeksag eval рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА?

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреНрд░реИрд╢рд┐рдВрдЧ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ, Gunicorn рдЕрдм рдПрдХ рдЪрд░ рдореЗрдВ create_app() рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рд╣реЗрдЬрдХрд░ рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдХреЗ рдореЗрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдореЗрд░реЗ Gunicorn рд░рди рдХрдорд╛рдВрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ

# app.py
def create_app():
    ...

my_app = create_app()

gunicorn "app:my_app" --workers 8

рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ @benoitc рдФрд░ @jrusso1020 рдиреЗ рдКрдкрд░

рд▓реЙрдиреНрдЪ рдХреЗ рд╕рдордп рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдореБрдЭреЗ рдлрд┐рдХреНрд╕ рдХрд╛рдо рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ:

Gunicorn --chdir hcli_core path "hcli_ core:HCLI (" hcli_core sample hfm ").connector"ред

рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕рд┐рдВрдЧ 19.9.0 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди 20.0.0 рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

@benoitc рдЕрдЧрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ, рддреЛ рдлреНрд▓рд╛рд╕реНрдХ рдбреЙрдХреНрд╕ рдЧрдирд┐рдХреЛрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп app:create_app() рдкреИрдЯрд░реНрди рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреБрдЫ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рдлреНрд▓рд╛рд╕реНрдХ рдРрдкреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрдирд┐рдХреЛрд░реНрди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡реЗ рдЙрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рд╕реЗ рдЕрдм-рдЯреВрдЯреА рд╣реБрдИ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ (рдпрд╣ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдХрдо рд╕реЗ рдХрдо рдерд╛)ред

рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЯреАрдо рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рдкрд░ exec рдХреЗ рдЧрд┐рд░рдиреЗ рдкрд░ @berkerpeksag рдХреЗ рд╡рдЬрди рдХрд╛ рдЗрдВрддрдЬрд╛рд░

@ tjwaterman99 рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдРрдк рдкрд░ рддрд░реНрдХ рджреЗрдирд╛ рдкрд╕рдВрдж рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рддрд░реНрдХ env рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдлреНрд▓рд╛рд╕реНрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╣рдорд╛рд░рд╛ рдЕрдкрдирд╛

cc @tilgovi @berkerpeksag ^^

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рд╣рдо рдЗрд╕рдореЗрдВ рднреА рднрд╛рдЧ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ "рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреИрдХреНрдЯреНрд░реА" рдлреНрд▓рд╛рд╕реНрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧ рд╣реИрдВред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХрд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЪреИрдВрдЬ рдХреЛ рдЗрд╕реЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдордиреЗ рдХрднреА рдЬрд╛рдирдмреВрдЭрдХрд░ app:callable() рдФрд░ app:callable(some, args) рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ eval() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдерд╛ред

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди Django рдХреЗ import_string() рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ:

https://github.com/django/django/blob/master/django/utils/module_loading.py#L7 -L24

рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ, рдПрдХ рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдПрдХ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдордиреЗ рдХрднреА рдЬрд╛рдирдмреВрдЭрдХрд░ рдРрдк: рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп () рдФрд░ рдРрдк: рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп (рдХреБрдЫ, рддрд░реНрдХ) рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ eval() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдерд╛ред

рд╣рд╛рдБ рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рд╣рдордиреЗ рдХрднреА рднреА рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдореИрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП +1 рд╣реВрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрдард╛рдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЖрд╡реЗрджрди рдХрд╛ рдирд╛рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд╛рдо рдирд╣реАрдВ рд╣реИ?

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рдореБрдЦ wsgi рдврд╛рдВрдЪреЗ (рдлреНрд▓рд╛рд╕реНрдХ) рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдерд╛, рдФрд░ рдкрд╣рд▓реЗ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред eval рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЖрд▓рд╕реА рд╢реБрд░реБрдЖрдд рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди 1) рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ 2) рдЧреИрд░-рддреБрдЪреНрдЫ рд╕реЗрдЯрдЕрдк рд▓рд╛рдЧрддреЗрдВ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдпрд╛ рдЕрдиреНрдп рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ eval рдЕрдиреБрдЪрд┐рдд рдХреНрдпреЛрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕реА рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдкрд╛рдпрдерди 3.7 рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдкреАрдИрдкреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореЙрдбреНрдпреВрд▓-рд╕реНрддрд░ __getattr__ рдмрдирд╛рдХрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓-рд╕реНрддрд░реАрдп рдЪрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди 20.0.0 рдореЗрдВ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рдХреЛ рд╣рд┐рдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд▓рд╕реА рджреАрдХреНрд╖рд╛ (рдПрдХ рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреИрдХреНрдЯреНрд░рд┐рдпреЛрдВ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

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

рд▓реЗрдХрд┐рди рдареАрдХ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдореИрдВ рддрдм eval рдХреЛ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд╣реВрдВрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╣рд┐рд╖реНрдХреГрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреВрдВрдЧрд╛ред рд╢рд╛рдпрдж рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ "рдлрд╝реИрдХреНрдЯрд░реА" рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрдВ, рд╣рдо рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ --init-args :

gunicorn -b :8000 --init-args="arg1,arg2"  app:factory_method

рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред рд╡рд┐рдЪрд╛рд░?

@benoitc рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реЛрдЧрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛:

$ gunicorn -b :8000 \
  --callable \
  --callable-arg "abc" \
  --callable-arg "xyz" \
  --callable-kwarg "key" "value" \
  app:factory_method

(рдпрд╛ рд╢рд╛рдпрдж рдХреЛрдИ рдЕрдиреНрдп рдЖрдзрд╛рд░ рдирд╛рдо, рдЬреИрд╕реЗ --factory )

рдореИрдВ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ (i) рдореЗрд░рд╛ рдРрдк рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, (ii) рдкрд░реАрдХреНрд╖рдг рд╕рдВрдЧреНрд░рд╣ рд╕рднреА рдореЙрдбреНрдпреВрд▓ (рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рд▓рд┐рдП) рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ (iii) рдореИрдВ рдЕрдм рдЖрдпрд╛рдд рдХреЗ рдмрд╛рдж рддрдХ рдРрдк рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реНрдердЧрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдореИрдВ рдПрдХ рд▓рдВрдмреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХрдорд╛рдВрдб рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдореИрдВ рдкрд╛рдпрдерди 3.7 рдкрд░ рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓-рд╕реНрддрд░ __getattr__ рд╕рд╛рде рд╣реИрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкреНрд░реА-3.7 рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдбрд╛рдЙрдирдЧреНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред рдЕрдЧрд░ рдореБрдЭреЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА

@ tjwaterman99 рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдРрдк рдкрд░ рддрд░реНрдХ рджреЗрдирд╛ рдкрд╕рдВрдж рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рддрд░реНрдХ env рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдлреНрд▓рд╛рд╕реНрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╣рдорд╛рд░рд╛ рдЕрдкрдирд╛

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд▓рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдо рд╕реЗ рдХрдо рдлреНрд▓рд╛рд╕реНрдХ, рдФрд░ рд╢рд╛рдпрдж рдЕрдиреНрдп рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд╕реНрддреБрдУрдВ/рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП +1, рдФрд░ exec рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде Gunicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред

рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдРрд╕рд╛ рд╣реБрдЖред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА рдЬрд╛рдПред рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╣рдо рд╕рднреА рдХреЛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд░ рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреАрдкреАрдкреАрдЖрдИ рд╕реЗ рд░рд┐рд▓реАрдЬ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдХрдареЛрд░ рд╣реИред Gunicorn рдиреЗ рдХрднреА рднреА рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдпрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреНрд╖рдорд╛ рдорд╛рдВрдЧрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВред

рд╣рдореЗрдВ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдлреНрд▓рд╛рд╕реНрдХ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдРрд╕рд╛ рдХрд░рдХреЗ рдЦреБрд╢ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣рд╛рдВ рдкреНрд░рд╡рд╛рд╕рди рдкрде рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ _separate_ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реИрдХреНрдЯрд░реА рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЧрдирд┐рдХреЛрд░реНрди рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдФрд░ рдЕрдиреНрдп рдЯреВрд▓рд┐рдВрдЧ рд╕реЗ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рддреЗ рд╕рдордп рдЕрд╡рд╛рдВрдЫрд┐рдд рдЖрдпрд╛рдд рдХреЛ рдЯреНрд░рд┐рдЧрд░ рди рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП __main__.py рдпрд╛ web.py рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИред рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ; рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ; рдФрд░ рдХрдИ рдЪреМрдЦрдЯреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХреЗ рд╣реИрдВред Gunicorn рдХреЛ рдЕрдкрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЧрдирд┐рдХреЛрд░реНрди рдХреА рд╕реАрдПрд▓рдЖрдИ рд╕рддрд╣ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдореЗрдВ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдлреНрд▓рд╛рд╕реНрдХ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдРрд╕рд╛ рдХрд░рдХреЗ рдЦреБрд╢ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣рд╛рдВ рдкреНрд░рд╡рд╛рд╕рди рдкрде рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ @bilalshaikh42 рдкрд╣рд▓реЗ рд╣реА https://github.com/pallets/flask/pull/3421 рдкрд░ рдРрд╕рд╛ рдХрд░ рдЪреБрдХрд╛ рд╣реИред

(рдпрд╣рд╛рдВ рдлреНрд▓рд╛рд╕реНрдХ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ)

рдЬрдмрдХрд┐ рдореИрдВ рд╡рд╣рд╛рдВ eval рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрдк рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╕рдорд░реНрдерди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП! рдПрдХ рдРрдк рдлрд╝реИрдХреНрдЯрд░реА рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп app рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд╕рд░реНрдХреБрд▓рд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд░рдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ)ред

flask run cli (рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрдк рдлреИрдХреНрдЯреНрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЖрдо рд╣реИрдВред

рдЬрд╝рд░реВрд░, wsgi.py рдпреБрдХреНрдд from myapp. import make_app; app = make_app() рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛ рддреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреЛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм pip install myapp рдмрд╕ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛), рдпрд╛ рдЗрд╕реЗ рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рдЗрд╕реЗ рднреАрддрд░ рд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдРрдк рд╣реА рдЬреЛ рдЧрд▓рдд рд╣реЛрдЧрд╛)

рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рд╣рдо рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдРрдк рдлрд╝реИрдХреНрдЯрд░реА рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдФрд░ eval рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдПрдХ

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

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

рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, zope.hookable рдПрдХ рдЖрд▓рд╕реА рдлреИрдХреНрдЯреНрд░реА-рдЬреИрд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХрд╛рд░рдг)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

# app.py
from zope.hookable import hookable

def make_app():
    def _(environ, start_response, value=b'Hello'):
        start_response('200 OK',
                       [('Content-Type', 'text/plain')])
        return [value]
    return _

<strong i="8">@hookable</strong>
def app(environ, start_response):
    real_app = make_app()
    app.sethook(real_app)
    return real_app(environ, start_response, b"First time")
$ gunicorn app:app
[2019-11-12 05:53:47 -0600] [12457] [INFO] Starting gunicorn 20.0.0
[2019-11-12 05:53:47 -0600] [12457] [INFO] Listening at: http://127.0.0.1:8000 (12457)
[2019-11-12 05:53:47 -0600] [12457] [INFO] Using worker: sync
[2019-11-12 05:53:47 -0600] [12460] [INFO] Booting worker with pid: 12460
...
% http localhost:8000
HTTP/1.1 200 OK
Connection: close
Content-Type: text/plain
Date: Tue, 12 Nov 2019 11:53:49 GMT
Server: gunicorn/20.0.0
Transfer-Encoding: chunked

First time

% http localhost:8000
HTTP/1.1 200 OK
Connection: close
Content-Type: text/plain
Date: Tue, 12 Nov 2019 11:53:51 GMT
Server: gunicorn/20.0.0
Transfer-Encoding: chunked

Hello

рдЬрд╝рд░реВрд░, wsgi.py рдпреБрдХреНрдд from myapp. import make_app; app = make_app() рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛ рддреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреЛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм pip install myapp рдмрд╕ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛), рдпрд╛ рдЗрд╕реЗ рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рдЗрд╕реЗ рднреАрддрд░ рд╕реЗ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдРрдк рд╣реА рдЬреЛ рдЧрд▓рдд рд╣реЛрдЧрд╛)

рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ wsgi.py рдХрд╛ рдПрдХ рдЕрдиреНрдп рдХрд╛рд░рдг рдЧрд▓рдд рд╣реИ: рдХреБрдЫ рдЯреВрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдбреЙрдХреНрдЯрд░реЗрдЯ рдХреА рддрд▓рд╛рд╢ рд╣реЛрддреА рд╣реИред

рдПрдХ рдФрд░ рдХреБрдкреНрдкреА рдореЗрдВрдЯреЗрдирд░ рдпрд╣рд╛рдБред @ThiefMaster рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд╣ рджрд┐рдпрд╛ рдЬреЛ рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдлреАрдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдорд░реНрдерди

рдореИрдВ eval рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реВрдВ, рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ flask run рдореЗрдВ рдЯрд╛рд▓рд╛ред рдЖрдк рдкрд┐рдЫрд▓реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реИрдВ, рддреЛ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдРрдк рджреЗрддрд╛ рд╣реИред рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП literal_eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдлрд┐рд░ рдлрд╝реИрдХреНрдЯрд░реА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдкреИрд░рд╛ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ wsgi.py рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд┐рдирд╛ рдлрд╝реИрдХреНрдЯрд░реА рдкреИрдЯрд░реНрди рдмрд╣реБрдд рдореВрд▓реНрдпрд╡рд╛рди рд╣реИред рдореИрдВ рдЗрд╕реЗ Gunicorn рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛/рдЪрд╛рд╣рддреА рд╣реВрдВред

рдХреНрдпрд╛ рдХреЛрдИ literal_eval рдлреИрдХреНрдЯреНрд░реА-рдЬреИрд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдЧрд╛? рдпрд╣ gunicorn.util.import_app ред

рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдХреЛрдб рдЧрдирд┐рдХреЛрд░реНрди рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/benoitc/gunicorn/compare/master...davidism:import-factory

@davidism рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдРрдк рдХрд╛рд░рдЦрд╛рдиреЛрдВ рд╕реЗ рдРрдкреНрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рд╕рд╛рде)ред рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдореЛрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (рд░реЗрдЧреЗрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп) рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХреЗ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдПрдПрд╕рдЯреА рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреАрд╡рд░реНрдб рддрд░реНрдХреЛрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдЕрднреА рднреА ast.parse рдФрд░ ast.literal_eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ eval рдХреЙрд▓ рдирд╣реАрдВ рд╣реИрдВ:

import ast
from types import ModuleType
from typing import Any


def get_app(module: ModuleType, obj: str) -> Any:
    """
    Get the app referenced by ``obj`` from the given ``module``.

    Supports either direct named references or app factories, using `ast.literal_eval` for safety.

    Example usage::

        >>> import collections
        >>> get_app(collections, 'Counter')
        <class 'collections.Counter'>
        >>> get_app(collections, 'Counter()')
        Counter()
        >>> get_app(collections, 'import evil_module')  # doctest: +ELLIPSIS
        Traceback (most recent call last):
          ...
        ValueError: Could not parse 'import evil_module' as a reference to a module attribute or app factory.
        >>> get_app(collections, '(lambda: sys.do_evil)()')
        Traceback (most recent call last):
            ...
        ValueError: App factories must be referenced by a simple function name
        >>> get_app(collections, '(1, 2, 3)')
        Traceback (most recent call last):
            ...
        ValueError: Could not parse '(1, 2, 3)' as a reference to a module attribute or app factory.
    """
    # Parse `obj` to an AST expression, handling syntax errors with an informative error
    try:
        # Note that mode='eval' only means that a single expression should be parsed
        # It does not mean that `ast.parse` actually evaluates `obj`
        expression = ast.parse(obj, mode='eval').body
    except SyntaxError as syntax_error:
        raise ValueError("Could not parse '{}' as a reference to a module attribute or app factory.".format(obj)) from syntax_error

    # Handle expressions that just reference a module attribute by name
    if isinstance(expression, ast.Name):
        # Expression is just a name, attempt to get the attribute from the module
        return getattr(module, expression.id)

    # Handle expressions that make a function call (factory)
    if isinstance(expression, ast.Call):
        # Make sure the function name is just a name reference
        if not isinstance(expression.func, ast.Name):
            raise ValueError("App factories must be referenced by a simple function name")

        # Extract the function name, args and kwargs from the call
        try:
            name = expression.func.id
            args = [ast.literal_eval(arg) for arg in expression.args]
            kwargs = {keyword.arg: ast.literal_eval(keyword.value) for keyword in expression.keywords}
        except ValueError as value_error:
            raise ValueError("Could not evaluate factory arguments, please ensure that arguments include only literals.") from value_error

        # Get and call the function, passing in the given arguments:
        return getattr(module, name)(*args, **kwargs)

    # Raise an error, we only support named references and factory methods
    raise ValueError("Could not parse '{}' as a reference to a module attribute or app factory.".format(obj))

рдпрджрд┐ рдирд┐рд░реНрдгрдп рдХреЗрд╡рд▓ рд╢реВрдиреНрдп-рддрд░реНрдХ рдРрдк рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рддрд░реНрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдирд╛рдореЛрдВ рдФрд░ рдлрд╝реИрдХреНрдЯрд░реА рдХреЙрд▓реЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдФрд░ рдлрд╝реИрдХреНрдЯрд░реА рдореЗрдВ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛)

@ThiefMaster рдореИрдВ рдЕрднреА рднреА

рдЬрд╝рд░реВрд░, myapp рд╕реЗ рдпреБрдХреНрдд рдПрдХ wsgi.py рдмрдирд╛рдирд╛ред рдЖрдпрд╛рдд рдореЗрдХ_рдПрдк; рдРрдк = make_app() рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛ рддреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреЛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм pip install myapp рдмрд╕ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛), рдпрд╛ рдЗрд╕реЗ рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рдЗрд╕реЗ рдРрдк рдХреЗ рднреАрддрд░ рд╕реЗ рд╣реА рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдЬреЛ рдЧрд▓рдд рд╣реЛрдЧрд╛)

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдРрд╕реА рдлрд╛рдЗрд▓ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдХреНрдпреЛрдВ рд░рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ?

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

рдпрджрд┐ рдпрд╣ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рд╣реИ, рддреЛ pip install рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред


рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред рдЖрдо рддреМрд░ рдкрд░ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ (env vars рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдРрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдРрдк рдлрд╝реИрдХреНрдЯрд░реА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ!

рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдХрд╕реНрдЯрдо рддрд░реНрдХ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

pytest рдкрд░реАрдХреНрд╖рдг рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реИрд╢реНрд╡рд┐рдХ app=Flask() рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╕рдордп рд╡рд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдРрдк рдлреИрдХреНрдЯреНрд░реА рдкреИрдЯрд░реНрди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп рдлреНрд▓рд╛рд╕реНрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдХрд╛рд░рдг рддрд░реНрдХ рдкреИрдЯрд░реНрди рд╡рд╛рд▓рд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ flask run рдореЗрдВ рд╕рдорд░реНрдерди рджрд┐рдпрд╛ред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдРрдк рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдзрд┐рдХ рдХрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдареАрдХ рд░рд╣реВрдВрдЧрд╛ рдЬреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

# an app is a name only
$ gunicorn module:app

# a factory has (), but no args allowed
$ gunicorn module:factory()

@tilgovi рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдореЗрд░рд╛ рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ eval (рдпрд╛ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд┐рдд) рдХреЛ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдХреНрдпреЛрдВ рджреЗ рд░рд╣рд╛ рдерд╛ред рджреВрд╕рд░реА рдУрд░, рд╣рд╛рдБ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрднреА рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдерд╛ рдФрд░ eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рдерд╛: /

@ рдбреЗрд╡рд┐рдбрд╡рд╛рдж рджрд┐рд▓рдЪрд╕реНрдкред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реЛрдЧрд╛?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдПрдХ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдПрдХ рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ рдЖрд╡реЗрджрди рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕реНрд╡рдпрдВ рдПрдХ рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ рдЖрд╡реЗрджрди рдирд╣реАрдВ рд╣реИред

@davidism рдореЗрд░рд╛ рдорддрд▓рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ


def make_app():
  from mymodule.application import MainApp
  return MainApp()

application = make_app()

рдлрд┐рд░ рдХреЛрдИ gunicorn -b :8000 somemodule:application рдЪрд▓рд╛рддрд╛ рд╣реИ

рдпрд╣ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛рдХрд░, рдХреЛрдб рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп application рдХрд╛ рд╣рдореЗрд╢рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдХ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣реА рдЗрд░рд╛рджрд╛ рдерд╛:

class Application:
    _app = None
    def __call__(self, environ, start_response):
        if self._app is None:
            from wherever import make_app
            self._app = make_app()
        return self._app(environ, start_response)

application = Application()

( zope.hookable рдЙрджрд╛рд╣рд░рдг рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд╣реА рд╣реИ, рд╕реНрдерд┐рд░-рдЕрд╡рд╕реНрдерд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрд╕ рдХрдо рдУрд╡рд░рд╣реЗрдбред)

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

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

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ "рдпрджрд┐ рдЖрдпрд╛рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдРрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рддрд┐рдд рдирд╛рдо рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ"ред

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

рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реАрдорд┐рдд "рдпрджрд┐ рдРрдк рдСрдмреНрдЬреЗрдХреНрдЯ рд╢реВрдиреНрдп рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдЗрд╕реЗ рдлрд╝реИрдХреНрдЯрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВ" рдкреИрдЯрд░реНрди рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбрдмреНрд▓реВрдПрд╕рдЬреАрдЖрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рд╕реЗ рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ . рдЕрдЧрд░ рд╣рдо рдЙрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ eval рд╕реЗ рдкрд░рд╣реЗрдЬ рдХрд░рддреЗ рд╣реБрдП рдкрд╣рд▓реЗ рдЬреЛ рдХреБрдЫ рднреА рдерд╛ рдЙрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣реА рд╡рд╣ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд░ рдХреЛрдИред

рдореБрдЭреЗ literal_eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ @davidism рдФрд░ @connorbrinton рджреЛрдиреЛрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рдкрд╕рдВрдж рд╣реИ ред

рдпрд╣ рдлрд╝реИрдХреНрдЯрд░реА рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛рддреЗ рд╣реБрдП, рдХреЛрдб рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╣рдореЗрд╢рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рд╡реИрд╕реЗ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдРрдк рдХреЛ рдЗрдирд┐рдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рд╢реНрд░рдорд┐рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрддрдирд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

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

рд╡реИрд╕реЗ рднреА рд╡рд┐рдХрд▓реНрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:

  1. рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрд╕рдорд░реНрдерд┐рдд, рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ (рдЧрдирд┐рдХреЛрд░реНрди рдореЗрдВ)ред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЛ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рдЕрдм рд╣рдо рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

(рез) рдПрдХ рдХрдард┐рди рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрд╛рд░реНрдХрд┐рдХ рд░рд╛рд╕реНрддрд╛ рднреА рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдордиреЗ рдХрднреА рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ред
(реи) рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реМрдВрджрд░реНрдп рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди UI рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЧрдирд┐рдХреЛрд░реНрди рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ/рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд╢рд╛рдмреНрджрд┐рдХ_рдПрд╡рд▓реНрд╕

рд╣рдо (2) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@tilgovi @jamadden @berkerpeksag @sirkonst рдЖрдкрдХреА рдкрд╕рдВрдж рдХреНрдпрд╛ рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд╣реБрдВрдЪ рдерд╛ , рдЬрд┐рд╕реЗ literal_eval рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд▓реЙрдЯрд▓реА рдбреИрд╢ рдореЗрдВ рдЖрдк Dash рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ server рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ Flask рдЙрджрд╛рд╣рд░рдг рд╣реЛрддрд╛ рд╣реИред рдХреБрдЫ рд▓реЛрдЧ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ:

gunicorn "module:app.server"

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред flask run рднреА рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Dash рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ __call__ рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ Flask.__call__ ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдбреИрд╢ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ server = app.server рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдЧрдирд┐рдХреЛрд░реНрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЧрд▓рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

@davidism рдореИрдВ рдЖрдЬ рдмреАрдорд╛рд░ рд╣реЛ рдЧрдпрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рд╕реЛрдорд╡рд╛рд░ рдХреЛ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @tilgovi рдХрд╛ рд╕реБрдЭрд╛рд╡ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдкреБрд░рд╛рдиреЗ eval рдХреА рдЬрдЧрд╣ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд eval рд░рдЦрдирд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░? рд╕реАрд╕реА @tilgovi

рдЬрдм рддрдХ рдЖрдк рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ, рдореИрдВ рд╢рдирд┐рд╡рд╛рд░ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдКрдкрд░ рд╕реЗ рдЬреБрдбрд╝реА рд╢рд╛рдЦрд╛ рдХреЛ рдкреАрдЖрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

@davidism рдЖрдЧреЗ рдмрдврд╝реЛред рдореИрдВ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдЖрдКрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдиреАрдб рд╣реЛрдиреЗ рдкрд░ рдореИрдВ рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реВрдВрдЧрд╛ :) рдзрдиреНрдпрд╡рд╛рдж!

рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ, рдЕрдм рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@connorbrinton ast.parse рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдЙрдВрдЧрд╛ рдФрд░ рдпрджрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬрд╛рддрд╛ рд╣реВрдВ рддреЛ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдкрд░ рд╕рд╣-рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реВрдВрдЧрд╛ред

рдмрд╕ рдЗрд╕рдореЗрдВ рдЭрдВрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп (рдФрд░ рдХрд╛рдлреА рдкреБрд░рд╛рдирд╛) рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдЙрддреНрддрд░ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ v19 рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ: https://stackoverflow.com/questions/ 8495367/рдЙрдкрдпреЛрдЧ-рдЕрддрд┐рд░рд┐рдХреНрдд-рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди-рддрд░реНрдХ-рд╕рд╛рде-рдЧрдирд┐рдХреЛрд░реНрди

рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рддрдп рдкреИрдЪ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @davidism !

рд╕рдВрднрд╛рд▓реЗ рдЧрдП рд╕рднреА рдорд╛рдорд▓реЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣реИрдВ: https://github.com/benoitc/gunicorn/commit/19cb68f4c3b55da22581c008659ee62d8c54ab2b#diff -5832adf374920d75d4bf48e546367f53R67

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

thomasjungblut picture thomasjungblut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mw44118 picture mw44118  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mw44118 picture mw44118  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zenglingyu picture zenglingyu  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

leonardbinet picture leonardbinet  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ