Django Daphne ASGI рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИ, рд▓реЗрдХрд┐рди Daphne рд╕рд░реНрд╡рд░ рдмреЗрд╣рдж рдирдпрд╛ рд╣реИ рдФрд░ рдЕрднреА рддрдХ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ SSL рд╕рдорд░реНрдерди, рдкрд░рд┐рдкрдХреНрд╡рддрд╛ рджрд░реНрдж рдирд╣реАрдВ)ред
рдХреНрдпрд╛ рдирд┐рд░реНрдмрд╛рдз WSGI/ASGI рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП GUnicorn рдореЗрдВ ASGI рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ?
@arcivanov рдореИрдВ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░
рдЗрд╕ рдЯрд┐рдХрдЯ рдХреЛ ASAP рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред
рдХреЛрдИ рдЕрдкрдбреЗрдЯреНрд╕?
@benoitc @berkerpeksag рдФрд░ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдИ-рдореЗрд▓ рдкрд░ рдмрд╛рддрдЪреАрдд рдХреАред рдЕрднреА рддрдХ рдХреЛрдИ рдХрд╛рдо рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ ASGI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ред рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрддреНрд╕рд╛рд╣рдкреВрд░реНрд╡рдХ рдорджрдж, рдЪрд░реНрдЪрд╛ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдХрд░реВрдВрдЧрд╛ред
рдореИрдВ рд╡реИрд╕реЗ рднреА рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдПрд╕рдЬреАрдЖрдИ рд╕реНрдкреЗрдХ рдХреЛ рдУрд╡рд░рд╣рд╛рд▓ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрддрд╛ рд╣реВрдВ (рдирдИ рдХрд▓реНрдкрдирд╛ рдпрд╣рд╛рдВ рддреИрдпрд╛рд░ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдХреБрд▓ рдЕрдВрддрд┐рдо рдирд╣реАрдВ рд╣реИ: http: / /channels.readthedocs.io/en/2.0/asgi.html - рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ WSGI рдХреА рддрд░рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ)
@andrewgodwin рдХреВрд▓ asgi . рдХреЗ рд╕рд╛рде рдЧрдирд┐рдХреЛрд░реНрди рдЖрдЬрд╝рдорд╛рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛
@andrewgodwin ASGI рдХрд╛ рджрд░реНрдЬрд╛ рдХреНрдпрд╛ рд╣реИ?
рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдПрдПрд╕рдЬреАрдЖрдИ рдРрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдореБрдЭреЗ рдпрд╣реА рдорд┐рд▓рд╛:
import json
def app(scope):
async def channel(receive, send):
message = await receive()
if scope['method'] == 'POST':
response = message
else:
response = scope
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'Content-Type', b'application/json'],
],
})
await send({
'type': 'http.response.body',
'body': json.dumps(response, default=bytes.decode).encode(),
})
await send({
'type': 'http.disconnect',
})
return channel
> daphne app:app
2018-03-31 22:28:10,823 INFO Starting server at tcp:port=8000:interface=127.0.0.1
2018-03-31 22:28:10,824 INFO HTTP/2 support enabled
2018-03-31 22:28:10,824 INFO Configuring endpoint tcp:port=8000:interface=127.0.0.1
2018-03-31 22:28:10,825 INFO Listening on TCP address 127.0.0.1:8000
127.0.0.1:43436 - - [31/Mar/2018:22:28:17] "GET /" 200 347
127.0.0.1:43440 - - [31/Mar/2018:22:28:22] "POST /" 200 43
127.0.0.1:43446 - - [31/Mar/2018:22:28:42] "POST /" 200 54
> http -b get :8000/
{
"type": "http"
"http_version": "1.1",
"method": "GET",
"path": "/",
"query_string": "",
"root_path": "",
"scheme": "http",
"headers": [
["host", "localhost:8000"],
["user-agent", "HTTPie/0.9.9"],
["accept-encoding", "gzip, deflate"],
["accept", "*/*"],
["connection", "keep-alive"]
],
"client": ["127.0.0.1", 43360],
"server": ["127.0.0.1", 8000],
}
> http -b -f post :8000/ foo=bar
{
"body": "foo=bar",
"type": "http.request"
}
> http -b -j post :8000/ foo=bar
{
"body": "{\"foo\": \"bar\"}",
"type": "http.request"
}
@sirex ASGI рдЕрдм рд╕реНрдерд┐рд░ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдбреИрдлрдиреЗ рдХрд▓реНрдкрдирд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
django рдкрд░ рд▓рд┐рдВрдХ ASGI "рдХрд▓реНрдкрдирд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЦрд┐рд░реА рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдХреБрдЫ рдФрд░ рд╣реИ рдЬреЛ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ?
@andrewgodwin рдореИрдВ рдПрдПрд╕рдЬреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдПрд╕рдЬреАрдЖрдИ рдЕрдиреНрдп рдврд╛рдВрдЪреЗ/рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@benoitc рджреЛ ASGI рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдкреГрд╖реНрда рд╣реИрдВ:
https://github.com/django/asgiref/blob/master/specs/asgi.rst - рд╕рд╛рдорд╛рдиреНрдп ASGI рд╡рд┐рдирд┐рд░реНрджреЗрд╢ред
https://github.com/django/asgiref/blob/master/specs/www.rst - HTTP рдФрд░ WebSockets рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ WSGI рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ред
@рд╕рд╛рдЗрд░реЗрдХреНрд╕ рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВ рдЬрдм рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рд╡реИрд╕реЗ рднреА рдореБрдЭреЗ https://channels.readthedocs.io/en/latest/ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдареАрдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкреЗрдк рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЕрдЬрдЧрд░ 2 рд╕рдорд░реНрдерди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдПрдПрд╕рдЬреАрдЖрдИ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдиреЗ рдЖрдЦрд┐рд░реА рдЯрд┐рдкреНрдкрдгреА рд╣рдЯрд╛ рджреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рдЪрд░реНрдЪрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдПрдПрд╕рдЬреАрдЖрдИ рдХреЛ рдкреАрдИрдкреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд░реНрдерди рдорд┐рд▓реЗ (рдФрд░ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рд▓рдЧрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд░рд╛рджрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЬреИрд╕рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЕрдЬрдЧрд░ 2 рд╕рдорд░реНрдерди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдПрдПрд╕рдЬреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдпреВрд╡рд┐рдХреЙрд░реНрди рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд▓рд╛рдпрдХ
(рдпреВрд╡рд┐рдХреЙрд░реНрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧрдирд┐рдХреЛрд░реНрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдЖрджрд┐ рдХреЗ рдмрд┐рдирд╛, рдмрд╕ рдПрдХ рдЕрдзрд┐рдХ рдиреНрдпреВрдирддрдо рд╡рд┐рдХрд▓реНрдк рдмрди рдЬрд╛рдПред)
рдПрдПрд╕рдЬреАрдЖрдИ рд╕реНрдкреЗрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЕрдм рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: https://asgi.readthedocs.io/en/latest/ред
рдареАрдХ рд╣реИ, рдЗрд╕реЗ рдЕрднреА рдХрд╡рд░ рдХрд░реЗрдВред (рддреГрддреАрдп-рдкрдХреНрд╖ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВред)
рдпреВрд╡рд┐рдХреЙрд░реНрди 0.2 рдЕрдм рдЗрд╕реЗ рд╕реАрдзреЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдирд┐рдХреЛрд░реНрди рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдПрд╕рдЬреАрдЖрдИ рдРрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЧрдирд┐рдХреЛрд░реНрди рд╡рд░реНрдХрд░ рдХреНрд▓рд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рд╕реАрдзреЗ рдпреВрд╡рд┐рдХреЙрд░реНрди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрдВрджреВрдХрдзрд╛рд░реА рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рддреЗ рд╣реИрдВред
http://www.uvicorn.org/#running -with-gunicorn
uvloop рдФрд░ httptools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, gunicorn рд╕реЗ ASGI рдРрдк рдЪрд▓рд╛рдПрдБ:
gunicorn app:App -w 4 -k uvicorn.workers.UvicornWorker
asyncio рдФрд░ h11 (pypy рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, gunicorn рд╕реЗ ASGI рдРрдк рдЪрд▓рд╛рдПрдБ:
gunicorn app:App -w 4 -k uvicorn.workers.UvicornH11Worker
рдпрджрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдХреЛрд░ рдЧрдирд┐рдХреЛрд░реНрди рдкреИрдХреЗрдЬ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдХреЛрдИ рдЗрдЪреНрдЫрд╛ рд╣реИ рддреЛ рдЙрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд▓рд╛ рд╣реИред
рдЕрдм рдЬрдм gunicorn
python
2
рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ ASGI
рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ
@tomchristie рдореБрдЭреЗ
рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╢рд╛рдпрдж рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдпрд╛ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдЧрдирд┐рдХреЛрд░реНрди рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдЬреЛ h11 рдФрд░/рдпрд╛ httptools рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП uvicorn
рдкрд░ рдирд┐рд░реНрднрд░ рдерд╛ред рдпрд╛ рдлрд┐рд░ рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВред
h11
рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд ASGI HTTP рд╕рдорд░реНрдерди Gunicorn рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рд╕реАрдорд┐рдд рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫреА рдЖрдзрд╛рд░ рд░реЗрдЦрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ?
рд╢рд╛рдпрдж рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдпрд╛ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд╛рд▓рдирд╛?
uvicorn
рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ - рдЕрдЧрд░ рд╣рдордиреЗ click
рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдФрд░ рд╕рд┐рд░реНрдл argparse рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рд╣рдорд╛рд░реА setup.py рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рддреЛ рдЗрд╕рдореЗрдВ рд╢реВрдиреНрдп рд╣рд╛рд░реНрдб рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди HTTP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, WS рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдИрд╡реЗрдВрдЯ рд▓реВрдкред
рдореБрдЭреЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА ASGI рд╕рдорд░реНрдерди рдЪрд╛рд╣рд┐рдП, рдЪрд╛рд╣реЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм Gunicorn рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛ, рдПрдХ рд╕реНрдЯрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЬреЛ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг, рдпрд╛ рдХреБрдЫ рдФрд░ред
рдЬреА рдмреЛрд▓рд┐рдпреЗред gunicorn рд╕реЗ daphne рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ .. рдЕрдЧрд░ gunicorn рдмрд╕ asgi рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЬреЛ рдореБрдЭреЗ рдЗрддрдирд╛ рд╕рдордп рдмрдЪрд╛рдПрдЧрд╛ред
@japrogramer http://www.uvicorn.org/#running -with -gunicorn
Django 3.0 (рджрд┐рд╕рдВрдмрд░ 2019 рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ) рдореЗрдВ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ ASGI рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛ , рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реАрдзреЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gunicorn
рдХрд╛ рдПрдХ рдФрд░ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рд╕рдВрднрд╡рдд: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░реБрдЪрд┐ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рд╡реГрджреНрдзрд┐ рджреЗрдЦреЗрдВрдЧреЗред
@johnthagen рдЬреЛ рдкрд╛рдЗрдк рдкрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдЯрд┐рдХрдЯреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛рдл рдХрд░рдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдорд╣реАрдиреЗ рд░рд┐рд▓реАрдЬ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдареАрдХ рд╣реИ, рдЗрд╕реЗ рдЕрднреА рдХрд╡рд░ рдХрд░реЗрдВред (рддреГрддреАрдп-рдкрдХреНрд╖ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВред)
рдпреВрд╡рд┐рдХреЙрд░реНрди 0.2 рдЕрдм рдЗрд╕реЗ рд╕реАрдзреЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдирд┐рдХреЛрд░реНрди рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдПрд╕рдЬреАрдЖрдИ рдРрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЧрдирд┐рдХреЛрд░реНрди рд╡рд░реНрдХрд░ рдХреНрд▓рд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рд╕реАрдзреЗ рдпреВрд╡рд┐рдХреЙрд░реНрди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрдВрджреВрдХрдзрд╛рд░реА рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рддреЗ рд╣реИрдВред
http://www.uvicorn.org/#running -with-gunicorn
uvloop рдФрд░ httptools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, gunicorn рд╕реЗ ASGI рдРрдк рдЪрд▓рд╛рдПрдБ:
asyncio рдФрд░ h11 (pypy рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, gunicorn рд╕реЗ ASGI рдРрдк рдЪрд▓рд╛рдПрдБ:
рдпрджрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдХреЛрд░ рдЧрдирд┐рдХреЛрд░реНрди рдкреИрдХреЗрдЬ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдХреЛрдИ рдЗрдЪреНрдЫрд╛ рд╣реИ рддреЛ рдЙрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд▓рд╛ рд╣реИред