Django рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, Django рдЪреИрдирд▓ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА Django рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЙрд╕реНрдХреЛ рдкрд╛рдпрдерди рдХреЙрдиреНрдл 2017 рдореЗрдВ рдЖрд░реНрдЯреАрдо рдорд╛рд▓рд┐рд╢реЗрд╡ рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ (рдЕрдм рд▓реЗрдЦрдХ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреИрдирд▓ 2 рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ), рдпрд╣ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬрд╝реЗрди рдЬрд╝реЗрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди рдПрдХрдорд╛рддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП,
рдкрд╛рдпрдерди рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рддреАрди рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВ ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдврд╛рдВрдЪреЗ рд╣реИрдВ:
- рдореБрдбрд╝;
- eventlet;
- Gevent;
- рддреВрдлрд╛рди;
- Asyncioред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдПрдХ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╕реНрдкреАрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдЕрд░реНрдЯрд┐рдУрдо рдорд╛рд▓рд┐рд╢реЗрд╡ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░ рд╣реИред рд╡рд╣ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВ, рдкрд╛рдпрдерди рдкрд░ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реИрдВред Artyom рдХреЛ
PROOFIT404 рдЙрдкрдирд╛рдо Github рдкрд░ рдФрд░ рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Django рдкрд░рд┐рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ ред рдЕрдЧрд░ рд╣рдо ORM рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЬрдм рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддрдм рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдПрдХреНрд╕реЗрд╕ рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, post.author.username, рдХреБрдЫ рднреА рдирд╣реАрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Django рдПрдХ WSGI рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред
WSGI
WSGI рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред
def app (environ, callback) : status, headers = '200 OK', [] callback (status, headers) return ['Hello world!\n']
рдЗрд╕рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдПрдХ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рднреА рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣рдорд╕реЗ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЛрдИ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдЧрдВрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред
рдпрд╣ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, 2003 рдореЗрдВ рд╡рд╛рдкрд╕, рдЬрдм рд╡реЗрдм рд╕рд░рд▓ рдерд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЦрдмрд░реЗрдВ рдкрдврд╝реАрдВ, рдФрд░ рдЕрддрд┐рдерд┐ рдкреБрд╕реНрддрдХреЛрдВ рдореЗрдВ рдЪрд▓реЗ рдЧрдПред рдпрд╣ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред рдПрдХ рдЙрддреНрддрд░ рджреЗрдВ рдФрд░ рдпрд╣ рднреВрд▓ рдЬрд╛рдПрдВ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдерд╛ред

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

рд╡реЗ рд░рд┐рдЪ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рд▓рд╛рдЗрд╡ рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░, рд▓реИрдкрдЯреЙрдк рдкрд░, рдЕрдиреНрдп рд╢реАрд░реНрд╖ рдкрд░, рдШрдбрд╝реА рдкрд░ рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХрд░реЗред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд,
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ F5 рдХреЛ рджрдмрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреЛрд▓рд┐рдпреЛрдВ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдмрдЯрди рдирд╣реАрдВ рд╣реИред

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

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ Django рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП Django рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ, Django рдХреЛрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИрдВред
рдЙрдиреНрд╣реЗрдВ
рдПрдВрдбреНрд░рдпреВ рдЧреЙрдбрд╡рд┐рди рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрджреНрднреБрдд рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдПрдХ рднрдпрд╛рдирдХ рдЕрдВрдЧреНрд░реЗрдЬреА рдЙрдЪреНрдЪрд╛рд░рдг рдХреЗ рдорд╛рд▓рд┐рдХ рдереЗ рдЬреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА рдмреЛрд▓рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдРрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рднреВрд▓реЗ рд╣реБрдП Django рд╕рд╛рдЙрде рдФрд░ Django рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВ, рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг 1.7 рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛ред рдЬрдм рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ Django рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рддрдп рдХрд┐рдпрд╛, рддрдм рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдФрд░ HTTP2 рдХреА рдорд░рдореНрдордд рд╢реБрд░реВ рдХрд░ рджреАред
рдЙрд╕рдиреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛? рдПрдХ рдмрд╛рд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рддрд╕реНрд╡реАрд░ рдереА: рдЦрд╛рд▓реА рд╡рд░реНрдЧ, рддреАрд░, рд╢рд┐рд▓рд╛рд▓реЗрдЦ "рдЕрдЪреНрдЫреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛" - рдЖрдк рдЗрди рдЫреЛрдЯреЗ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рддрдХрдиреАрдХреЛрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддрд░рд╛рдЬреВ рд╣реЛрддреА рд╣реИред

рдПрдВрдбреНрд░рдпреВ рдЧреЙрдбрд╡рд┐рди рдиреЗ рдЗрди рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд░ рдбрд╛рд▓рд╛, рдЬреЛ рд╕рд╛рдордиреЗ рдЦрдбрд╝рд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╡реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдИ-рдореЗрд▓, рдЬреЛ рднреА рд╣реЛрдВред рдЙрдирдХреЗ рдмреАрдЪ рддрдерд╛рдХрдерд┐рдд рдЪреИрдирд▓ рд▓реЗрдпрд░ рд╣реИ, рдЬреЛ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рдкреВрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реИред рдЬреИрд╕реЗ рд╣реА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрдиреЗрдХреНрд╢рди рдиреЗ рд╣рдореЗрдВ рдХреБрдЫ рднреЗрдЬрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЪреИрдирд▓ рд▓реЗрдпрд░ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд░реНрдХрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рднреА Django рд╡реНрдпреВ рдпрд╛ рдХреБрдЫ рдФрд░, рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдиреЗ рдЪреИрдирд▓ рд▓реЗрдпрд░ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рднреЗрдЬреА, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд░реНрд╡рд░ рдЗрд╕реЗ рджреЗ рджреЗрдЧрд╛, рдЗрд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЙрд╕реЗ рдХрд░реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдпрд╣
рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ Django рдФрд░
Redis рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдкрдЯрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ Django рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореБрдбрд╝ рдХреЗ рдмреАрдЪ рдПрдХ рд╣реА рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рд╣реЛрдЧрд╛ред
рдЕрдЪреНрдЫреА рдЦрдмрд░: Django рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдпрд╛ рд░реЗрдбрд┐рд╕ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИрдВред рдЖрдкрдХреЗ DevOps рдХреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдЖрдк рдорд┐рд▓реЗрдВрдЧреЗ рдЬрдм рдЖрдк рд╕реБрдмрд╣ рддреАрди рдмрдЬреЗ рдПрдХ рдЧрд┐рд░рддреЗ рдЙрддреНрдкрд╛рджрди рдХреА рдорд░рдореНрдордд рдХрд░реЗрдВрдЧреЗред
ASGI
рдПрдмреНрд╕реНрдЯреНрд░реЗрдХреНрд╢рди рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ рдЬрд┐рд╕реЗ рдПрдПрд╕рдЬреАрдЖрдИ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рдд рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛред рдЗрд╕рдХреА рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдЪреИрдирд▓ рд╣реИред
рдЪреИрдирд▓
рдПрдХ рдЪреИрдирд▓ рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдкрд╣рд▓реА-рдкрд╣рд▓реА-рдкрд╣рд▓реА рдХрддрд╛рд░ рд╣реИ, рдЬрд┐рдирдореЗрдВ рдЬреАрд╡рдирдХрд╛рд▓ рд╣реИред рдпреЗ рд╕рдВрджреЗрд╢ рд╢реВрдиреНрдп рдпрд╛ рдПрдХ рдмрд╛рд░ рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ
рдХрдВрдЬреНрдпреВрдорд░ рдореЗрдВ, рдЖрдк рд╕рд┐рд░реНрдл рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред
def ws_message (message) : message.reply_channel.send ( { 'text': message.content ['text'], } )
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХрд┐рд╕реА рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдХрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХрд┐рддрдиреЗ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВред
рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реВрдЯрд┐рдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рдЯрдХрд╛рдПрдВред
from channels.routing import route from myapp.consumers import ws_message channel_routing = [ route ('websocket.receive' ws_message), }
рд╣рдо рдЗрд╕реЗ Django рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
CHANNEL_LAYERS = { 'default': { 'BACKEND': 'asgiref.inmemory', 'ROUTING': 'myproject.routing', }, }
рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдИ рдЪреИрдирд▓ рдкрд░рддреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╛рдд db рд░рд╛рдКрдЯрд░ рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддреА рдЬреБрд▓рддреА рд╣реИ рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреЗ рдПрдПрд╕рдЬреАрдЖрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реНрдб рд╡рд░реНрдХрд░реНрд╕ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - рдЗрди рд╕рднреА рдХреЛ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
import os from channels.asgi import get_channel_layer os.environ.setdefault( 'DJANGO_SETTINGS_MODULE', 'myproject.settings', ) channel_layer = get_channel_layer()
рдЙрд╕рдХреЗ рдмрд╛рдж, рдХреЛрдб рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВ: gunicorn рдЪрд▓рд╛рдПрдВ, рдорд╛рдирдХ рд░реВрдк рд╕реЗ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ, рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ Django рдХреЗ рд╕рд╛рдордиреЗ рд╕рдмрд╕реЗ рдЖрдЧреЗ рд╣реЛрдЧрд╛, рдФрд░ рдЬреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред
$ gunicorn myproject.wsgi $ daphne myproject.asgi:channel_layer $ django-admin runworker
Reply рдЪреИрдирд▓
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, рд╕рдВрджреЗрд╢ рдореЗрдВ рдЙрддреНрддрд░ рдЪреИрдирд▓ рдЬреИрд╕рд╛ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдЪреИрдирд▓ рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓, рдХреНрд░рдорд╢рдГ WebSocket рдкреНрд░рд╛рдкреНрдд, WebSocket рдХрдиреЗрдХреНрдЯ, WebSocket рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ - рдпрд╣ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪреИрдирд▓ рд╣реИред рдПрдХ рдЙрддреНрддрд░ рдЪреИрдирд▓ рдПрдХ рдЪреИрдирд▓ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрдиреЗрдХреНрд╢рди рд╕реЗ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЪреИрдирд▓ рд╣реИред рдпрд╣ рдЬреЛрдбрд╝реА рдЖрдкрдХреЛ рдпрд╣ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрджреЗрд╢ рдХрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╕реЗ рдЖрдпрд╛ рд╣реИред

рд╕рдореВрд╣
рдПрдХ рд╕рдореВрд╣ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рд╕рдореВрд╣ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрд╡рддрдГ рд╣реА рдЗрд╕ рд╕рдореВрд╣ рдХреЗ рд╕рднреА рдЪреИрдирд▓реЛрдВ рдХреЛ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рд▓реВрдк рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд╕рдореВрд╣реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдорддреМрд░ рдкрд░ рдЪреИрдирд▓ рдкрд░рдд рдХреЗ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╕реЗ рддреЗрдЬ рд╣реИред
from channels import Group def ws_connect (message): Group ('chat').add (message.reply_channel) def ws_disconnect (message): Group ('chat').discard(message.reply_channel) def ws_message (message): Group ('chat'). Send ({ 'text': message.content ['text'], })
рд╕рдореВрд╣реЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд░реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
from channels.routing import route from myapp.consumers import * channel_routing = [ route ('websocket.connect' , ws_connect), route ('websocket.disconnect' , ws_disconnect), route ('websocket.receive' , ws_message), ]
рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЪреИрдирд▓ рдХреЛ рдЧреНрд░реБрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд░рд┐рдкреНрд▓рд╛рдИ рдЙрди рд╕рднреА рдпреВрдЬрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рди рдХрд┐ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдЗрдХреЛ рдЬрд╡рд╛рдмред
рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрднреЛрдХреНрддрд╛
рдХреНрдпрд╛ рдореИрдВ Django рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдШреЛрд╖рдгрд╛рддреНрдордХ рдЙрдкрднреЛрдХреНрддрд╛ рд╣реИрдВред
рдмреЗрд╕ рдХрдВрдЬреНрдпреВрдорд░ рдПрдХ рдмреЗрд╕рд┐рдХ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕ рдЪреИрдирд▓ рдХреЛ рдореИрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдХрд┐рд╕реА рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред
from channels.generic import BaseConsumer class MyComsumer (BaseConsumer) : method_mapping = { 'channel.name.here': 'method_name', } def method_name (self, message, **kwargs) : pass
рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдЙрдкрднреЛрдХреНрддрд╛, рдЬреЛ рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ WebSocket рдХрдиреЗрдХреНрдЯ, WebSocket рдкреНрд░рд╛рдкреНрдд, WebSocket рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛ред рдЖрдк рддреБрд░рдВрдд рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╕рдореВрд╣ рдореЗрдВ рдЙрддреНрддрд░ рдЪреИрдирд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЖрдк self.send рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдореВрд╣ рдореЗрдВ рдпрд╛ рдХрд┐рд╕реА рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
from channels.generic import WebsocketConsumer class MyConsumer (WebsocketConsumer) : def connection_groups (self) : return ['chat'] def connect (self, message) : pass def receive (self, text=None, bytes=None) : self.send (text=text, bytes=bytes)
JSON рдХреЗ рд╕рд╛рде рдПрдХ WebSocket рдЙрдкрднреЛрдХреНрддрд╛ рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ, рдпрд╛рдиреА рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ, рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ JSON рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдПрдЧрд╛, рдЬреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рд░реВрдЯрд┐рдВрдЧ рдореЗрдВ, рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдорд╛рд░реНрдЧ_рдХреНрд▓рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред Myapp рдХреЛ path_class рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрднреЛрдХреНрддрд╛ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд╕рднреА рдЪреИрдирд▓ рд╡рд╣рд╛рдВ рд╕реЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ myapp рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рдЪреИрдирд▓ рд░реВрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХрдо рд▓рд┐рдЦрд┐рдПред
рд░реВрдЯрд┐рдВрдЧ
рдЖрдЗрдП рд░реВрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИрдВред
// app.js S = new WebSocket ('ws://localhost:8000/chat/')
рдпрд╣ рд╡рд╣ рд░рд╛рд╕реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди URI, рдпрд╛ http рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛ред рдпрд╣ рдЪреИрдирд▓ рд╕реЗ рдХреЛрдИ рднреА рд╕рдВрджреЗрд╢ рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИ-рдореЗрд▓ рдХреЗ рд▓рд┐рдП: рдЯреЗрдХреНрд╕реНрдЯ, рдмреЙрдбреА, рдХрд╛рд░реНрдмрди рдХреЙрдкреА, рдЬреЛ рднреА рд╣реЛред рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдордирдорд╛рдиреА рд╣реИред
рд░реВрдЯрд┐рдВрдЧ рдЖрдкрдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдорд╛рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХрдИ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдореВрд╣ рдореЗрдВ рд░рдЦрдирд╛ рдФрд░ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдХреЛ рдорд╛рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
from channels import route, include blog_routes = [ route ( 'websocket.connect', blog, path = r'^/stream/') , ] routing = [ include (blog_routes, path= r'^/blog' ), ]
рдмрд╣реБрд╕рдВрдХреЗрддрди
рдпрджрд┐ рд╣рдо рдХрдИ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ URI рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЙрди рдкрд░ рдХрдИ рд╣реИрдВрдбрд▓рд░ рд▓рдЯрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдмреИрдХрдПрдВрдб рдкрд░ рдХреБрдЫ рд╕реБрдВрджрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкрд░ рдХрдИ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╣рдо рдРрд╕реЗ WebsocketDemultiplexer рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХрд▓ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рднреАрддрд░ рд╕реНрдЯреНрд░реАрдо рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╣ рдЖрдкрдХреЗ рд╕рдВрджреЗрд╢ рдХреЛ рджреВрд╕рд░реЗ рдЪреИрдирд▓ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ред
from channels import WebsocketDemultiplexer class Demultiplexer (WebsocketDemultiplexer) : mapping = { 'intval': 'binding.intval', }
рд░реВрдЯрд┐рдВрдЧ рдореЗрдВ, рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдШреЛрд╖рдгрд╛рддреНрдордХ рдЙрдкрднреЛрдХреНрддрд╛ рдорд╛рд░реНрдЧ_рдХреНрд▓рд╛рд╕ рдореЗрдВред
from channels import route_class, route from .consumers import Demultiplexer, ws_message channel_routing = [ route_class (Demultiplexer, path='^/binding/') , route ('binding.intval', ws_message ) , ]
рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рддрд░реНрдХ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗ рдХрд┐ рджрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдПред рдкреЗрд▓реЛрдб рддрд░реНрдХ рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рдж рдЪреИрдирд▓ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЪреИрдирд▓ рд▓реЗрдпрд░ рдореЗрдВ, рд╕рдВрджреЗрд╢
рджреЛ рдмрд╛рд░ рдорд┐рд▓реЗрдЧрд╛: рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд░ рдХреЗ рдмрд╛рджред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬреИрд╕реЗ рд╣реА рдЖрдк рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╡рд┐рд▓рдВрдмрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
{ "stream" : "intval", "payload" : { тАж } }
рд╕рддреНрд░
рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ рдХреЗ рдЕрдкрдиреЗ рд╕рддреНрд░ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЙрддреНрддрд░ рдЪреИрдирд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИред рд╕рддреНрд░ рдХреЛ рдирд┐рдпрдорд┐рдд http рд╕рддреНрд░ рдХреЗ рд╕рдорд╛рди рдЗрдВрдЬрди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдХреБрдХреАрдЬрд╝ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдмрд╕ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред
from channels.sessions import channel_session @channel_session def ws_connect(message) : room=message.content ['path'] message.channel_session ['room'] = room Croup ('chat-%s' % room).add ( message.reply_channel )
рдХрдиреЗрдХреНрд╢рди рдХреЗ рджреМрд░рд╛рди, рдЖрдк рдПрдХ http рд╕рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЙрдкрднреЛрдХреНрддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рддрдЪреАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдХреБрдХреАрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдЗрд╕рд▓рд┐рдП, рдЖрдк рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ Django рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗред
from channels.sessions import http_session_user @http_session_user def ws_connect(message) : message.http_session ['room'] = room if message.user.username : тАж
рд╕рдВрджреЗрд╢ рдЖрджреЗрд╢
рдЪреИрдирд▓ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рджреЛ рдШрдЯрдирд╛рдПрдБ - WebSocket рдХрдиреЗрдХреНрдЯ рдФрд░ WebSocket рдкреНрд░рд╛рдкреНрдд - рд╕рдордп рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрди рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрднреЛрдХреНрддрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдбреЗрдмреНрдпреВ рдХрд░рдирд╛ рдХрд╛рдлреА рдордЬреЗрджрд╛рд░ рд╣реЛрдЧрд╛ред
Django рдЪреИрдирд▓ рдЖрдкрдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЙрдХ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
- рдЖрд╕рд╛рди рддрд╛рд▓рд╛ ред рд╕рддреНрд░ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рддрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╣рдо рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрджреЗрд╢ рдордирдорд╛рдирд╛ рд╣реИ, рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрднрд╡ рд╣реИред
- рд╣рд╛рд░реНрдб рд▓реЙрдХ - рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдПрдХ рд╕рдордп рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдзреАрдорд╛ рд╕рддреНрд░ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реИред
from channels.generic import WebsocketConsumer class MyConsumer(WebsocketConsumer) : http_user = True slight_ordering = True strict_ordering = False def connection_groups (self, **kwargs) : return ['chat']
рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣реА рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ http рд╕реЗрд╢рди, рдЪреИрдирд▓ рд╕реЗрд╢рди рдореЗрдВ рджреЗрдЦреЗ рдереЗред рдШреЛрд╖рдгрд╛рддреНрдордХ рдЙрдкрднреЛрдХреНрддрд╛ рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред
рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ
рдПрдХ рд╕рдордп рдореЗрдВ, Meteor рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рд╣реЛ рдЧрдпрд╛ред
рд╣рдо рджреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдПрдХ рд╣реА рдкреЗрдЬ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣рдо рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рджреВрд╕рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдЗрд╕ рдкреГрд╖реНрда рдкрд░, рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдЕрдкрдирд╛ рдорд╛рди рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рдорд╕реНрдд рд╣реИред
class IntegerValueBinding (WebsocketBinding) : model = IntegerValue stream = intval' fields= ['name', 'value'] def group_names (self, instance, action ) : return ['intval-updates'] def has_permission (self, user, action, pk) : return True
Django рдЕрдм рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рд╣реИред
рдпрд╣
Django рд╕рд┐рдЧреНрдирд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдмрдВрдзрди рдХреЛ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореЙрдбрд▓ рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдореВрд╣ рдореЗрдВ рдореМрдЬреВрдж рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдордиреЗ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛, рдореЙрдбрд▓ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ - рдпрд╣ рд╕рдм рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдЧреАред рд╕рдВрдХреЗрддрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╣реЛрддреА рд╣реИ: рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реИ - рдПрдХ рдкреЗрд▓реЛрдб рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрджреЗрд╢ рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдореЙрдбрд▓ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рднрд╛рд░ рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рд╕рдм рдХреБрдЫ рдЖрдзрд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рд░рд╣рддрд╛ рд╣реИред
рд▓рд╛рд▓ рдкрд░рдд
рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдФрд░ рдмрд╛рдд рдХрд░реЗрдВ рдХрд┐ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЪреИрдирд▓ рд▓реЗрдпрд░ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ - рд░реЗрдбрд┐рд╕ред
рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ:
- рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдордХрд╛рд▓рд┐рдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ;
- рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓, рдзреАрдорд╛ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕рд░реНрд╡рд░ рдкрд░ рд╣реИ;
- MSGPACK рдХрд╛ рдЙрдкрдпреЛрдЧ Redis рдХреЗ рдЕрдВрджрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдкрд░ рдкрджрдЪрд┐рд╣реНрди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ;
- рдЖрдк рдХрдИ Redis рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓реЛрдб рд╡рд┐рддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реБрд╕рдВрдЧрдд рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлреЗрд░рдмрджрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдПрдХ рдмрд┐рдВрджреБ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЪреИрдирд▓ рд░реЗрдбрд┐рд╕ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдЖрдИрдбреА рд╕реВрдЪреА рд╣реИред рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрджреЗрд╢ рдХрд╛ рдореВрд▓реНрдп рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдФрд░ рдЪреИрдирд▓ рдХреЗ рдЬреАрд╡рди рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред
>> SET "b6dc0dfce" " \x81\xa4text\xachello" >> RPUSH "websocket.send!sGOpfny" "b6dc0dfce" >> EXPIRE "b6dc0dfce" "60" >> EXPIRE "websocket.send!sGOpfny" "61"
рд╕рдореВрд╣ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рддрд░рдг рд▓реБрдЖ рд▓рд┐рдкрд┐ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред
>> type group:chat zset >> ZRANGE group:chat 0 1 WITHSCORES 1) "websocket.send!sGOpfny" 2) "1476199781.8159261"
рд╕рдорд╕реНрдпрд╛рдПрдВ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред
рдХреЙрд▓рдмреИрдХ рдирд░рдХ
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдирд╡ рдЖрд╡рд┐рд╖реНрдХреГрдд рдХреЙрд▓рдмреИрдХ рдирд░рдХ рд╣реИред рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЬрд┐рди рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛрдЧрд╛ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рд╣реЛрдВрдЧреА: рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдкрд╛рд╕ рддрд░реНрдХ рдЖрдП рдХрд┐ рд╡рд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рд╡реЗ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдП рдереЗ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд░реЗрдбрд┐рд╕ рдкрд░ рд░рдЦрд╛ рдерд╛ - рдпрд╣ рд╕рдм рдПрдХ рд╕рдВрджрд┐рдЧреНрдз рдЬрд╛рдВрдЪ рдХрд╛рд░реНрдп рд╣реИред рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдЖрдорддреМрд░ рдкрд░ рдордЬрдмреВрдд-рдЗрдЪреНрдЫрд╛рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдПред AsyncIO рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
рдЕрдЬрд╡рд╛рдЗрди
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рд╡реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ Django рдЪреИрдирд▓ рд╕реЗрд▓реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдкрдХреЗ рд▓рд┐рдП рдмреБрд░реА рдЦрдмрд░ рд╣реИ - рдирд╣реАрдВ, рдпрд╣ рдирд╣реАрдВ рд╣реИред
рдЪреИрдирд▓реЛрдВ рдореЗрдВ:
- рдХреЛрдИ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ, рдЖрдк рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рджреЗрд░реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
- рдХреЛрдИ рдХреИрдирд╡рд╛рд╕ рдирд╣реАрдВ - рдмрд╕ рдПрдХ рдХреЙрд▓рдмреИрдХред рдЕрдЬрд╡рд╛рдЗрди рднреА рд╕рдореВрд╣, рдЪреЗрди, рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ рдХреЙрд░реНрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рдореВрд╣реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдЪреИрдирд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИ;
- рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рдордп рдХреА рдХреЛрдИ рд╕реЗрдЯрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЗрд╡рд▓ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рдореИрдВ рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде, рдиреНрдпреВрдирддрдо рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде, рдЪреИрдирд▓ рдФрд░ рдЕрдЬрд╡рд╛рдЗрди рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд░реНрдерди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди Django рдЪреИрдирд▓ рд╕реЗрд▓реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИред
рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдХреЗ рд▓рд┐рдП Django
Django рдЪреИрдирд▓ рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдХреЗ рд▓рд┐рдП Django рд╣реИред рдпрд╣ рд╡рд╣реА Django рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдмрд╣реБрдд рд╕рд╛рд░реА рдмреИрдЯрд░реА рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░реЛрдирд╕, рдбрд┐рдХреНрд▓реЗрд░реЗрдЯрд┐рд╡ред Django рдЪреИрдирд▓ рд╕рд┐рд░реНрдл рдПрдХ рдмреИрдЯрд░реА рд╣реИред рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрджрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ Django рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪреИрдирд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡реЗ рдХреЗрд╡рд▓ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ Django рдЙрдЪрд┐рдд рд╣реИред
рдореЙрд╕реНрдХреЛ рдкрд╛рдпрдерди рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ ++
рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрд╢реЗрд╡рд░ рд╕рдореНрдореЗрд▓рди рдПрдХ рдирдП рд╕реНрддрд░ рдкрд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ - 22 рдФрд░ 23 рдЕрдХреНрдЯреВрдмрд░, 2018 рдХреЛ рд╣рдо рд░реВрд╕ рдореЗрдВ 600 рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВрдЧреЗ, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд░рд┐рдкреЛрд░реНрдЯ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдУрдЯрд┐рдХреЛ рдХреА рдЯреАрдо рдХреЗ рд╕рд╣рдпреЛрдЧ рд╕реЗ рдореЙрд╕реНрдХреЛ рдкрд╛рдпрдерди рд╕рдореБрджрд╛рдп рдХреА рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкрд░рдВрдкрд░рд╛рдУрдВ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд┐рддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ рдФрд░ 7 рд╕рд┐рддрдВрдмрд░ рддрдХ рдЖрд╡реЗрджрди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИред
рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдирд▓рд╛рдЗрди рдордВрдерди рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЖрдк рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдпрд╛ рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рд▓рд╛рдкрддрд╛ рд╡рд┐рд╖рдп рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рднрд╛рд╖рдг рдЖрдкрдХреЗ рд╣рд┐рдд рдореЗрдВ рд╣реЛрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд░ рд╕рдордп рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЧрдарди рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред