рдПрдХ Django рдЖрд╡реЗрджрди рдореЗрдВ рдЕрдЬрд╡рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 3 рдорд╛рдорд▓реЗ

рдЫрд╡рд┐

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

рдЕрдЬрд╡рд╛рдЗрди рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо 2 рдЪреАрдЬреЗрдВ: рдХрддрд╛рд░ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЗрдВ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдХрддрд╛рд░ рдмреНрд░реЛрдХрд░ рдЖрдорддреМрд░ рдкрд░ RabbitMQ рдпрд╛ Redis рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЗрд▓реЗрд░реА рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВред

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

1. рдЕрдиреБрд╕реВрдЪрд┐рдд рдХрд╛рд░реНрдп


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

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

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

# schedule.py from datetime import timedelta from celery.schedules import crontab CELERYBEAT_SCHEDULE = { 'publish_post_starter': { 'task': 'publish_post_starter', 'schedule': timedelta(minutes=1), }, 'end_trial_starter': { 'task': 'end_trial_starter', 'schedule': crontab(hour=10, minute=21), }, } 

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

 # tasks.py @app.task(name='publish_post') def publish_post(post_id): ... @app.task(name='publish_post_starter') def publish_post_starter(): post_ids = list( Post.objects.filter( publish_dt__lte=timezone.now(), is_published=False ).values_list('id', flat=True) ) for post_id in post_ids: publish_post.delay(post_id) 

2. рд▓реЙрдиреНрдЧ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдФрд░ рдПрдкреАрдЖрдИ WSGI рд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ


WSGI рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрдХреНрд░)ред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ - рдЕрдЬрд╡рд╛рдЗрдиред

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

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

 # rest_views.py from rest_framework import status from rest_framework.views import APIView from rest_framework.response import Response from tasks import send_emails class SendEmailView(APIView): def post(self, request): # this id will be used to send response with websocket request_uuid = request.data.get('request_uuid') if not request_uuid: return Response(status=status.HTTP_400_BAD_REQUEST) send_emails.delay(request.user.id, request_uuid) return Response(status=status.HTTP_200_OK) 

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

3. рдмрд╡рдВрдбрд░ рд╕реЗ рдЪреБрдиреМрддреА


рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХ, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдпрд╛ рднреБрдЧрддрд╛рди рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдПрдХ webhook url рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдЖрдПрдВрдЧреАред рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣рдореЗрд╢рд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░реЗрдЧреАред рдпреЗ рдЕрдиреБрд░реЛрдз рддрдм рддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬрдм рддрдХ рдЙрдиреНрд╣реЗрдВ рдХреЛрдб 200 рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддреАред

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

 # tornado_handlers.py from tornado import gen, escape from tornado.web import RequestHandler from tasks import handle_vk_callback class VkCallbackHandler(RequestHandler): @gen.coroutine def post(self, *args, **kwargs): try: data = escape.json_decode(self.request.body) except ValueError: self.set_status(status_code=400, reason='Invalid data') return handle_vk_callback.delay(data) self.write('ok') return 

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


All Articles