рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ http рдПрдкреАрдЖрдИ rzhd рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЖрд╡рд░рдг рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рдЧрд░рд╛рдиреА рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╛рдЗрдЯ рдЕрднреА рднреА
рдпрд╣рд╛рдВ рд╕реНрдерд┐рдд
рд╣реИ рдФрд░
рдпрд╣рд╛рдВ рдПрдХ рд╕реНрдкреЗрдпрд░ рд╣реИ ред
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереНрд░реЗрдбрд╕реЗрдлрд╝
рдирд╣реАрдВ рдерд╛, рдЕрд░реНрдерд╛рддред
app.yaml рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ
рдпрд╣ рд╕реВрдЪреАрдмрджреНрдз
рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
threadsafe: false
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░реЗрдВ, рдмрджрд▓реЗрдВ:
def main(): application.run() if __name__ == "__main__": main()
рдкрд░:
app = webapp2.WSGIApplication([ ('/', MainPage), ], debug=False)
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдХреБрдЫ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛, рдЗрд╕ рд╕рдм рд╕реЗ рд▓рд╛рдн рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
рдереНрд░реЗрдбрд╕реЗрдлрд╝ рдХреЗ рд╕рд╛рде
: рдЭреВрдареА рдПрдкреЗрдВрдЧрд╛рдЗрди рдХрддрд╛рд░ рдореЗрдВ рдирдП рд╕рддреНрд░ рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ (рдПрдХ рдЫреЛрдЯреЗ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде), рдЬрдм
рдереНрд░реЗрдбрд╕реЗрдлрд╝ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИ,
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рддрд░реНрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рджреЛ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛: рдореБрдХреБрдЯ рджреНрд╡рд╛рд░рд╛ рдореЗрд▓ рдФрд░ рд▓реЙрдиреНрдЪ, рдЪрд▓реЛ рдореБрдХреБрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд╛рд░реНрдп
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ cron.yaml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рддрд╛рдЬ рдХреЛ рдХрдм рдФрд░ рдХрд┐рддрдиреА рдмрд╛рд░ рдбреЗрдорди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
cron: - description: mail summary job url: /summary_mail schedule: every 1 hours
рдкрд░
/summary_mail
рд╣рдо рд╕рдХреНрд░рд┐рдп рдЦрд╛рддреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдЯрдХрд╛ рджреЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдЦрд░рд╛рдм рдЕрдВрдХрд▓ рдЗрд╕реЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рди рдЦреАрдВрдЪ рд╕рдХреЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рд╕рднреА рдХреЛрдЯрд╛ рдФрд░ рд╕реНрдкреИрдо рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦрд╛рдПрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рд╡реЗрд╢ рдФрд░ Google рдпрд╛рддреНрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдРрдк рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВ
редyaml :
- url: /summary_mail script: web.app login: admin
рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдХреА рд╕реВрдЪреА рдкреНрд░рд╢рд╛рд╕рдХ рдХреЗ рдХрдВрд╕реЛрд▓ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИ (рджреЛрд╕реНрддреЛрдВ,
рд╕реНрдХреВрд▓реА рдмрдЪреНрдЪреЗ рд╣реИрдХрд░реНрд╕ рд╣реИрдВ, рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЛрдИ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ "рдкрдВрдЪ" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЙрдЧ рд╕реЗ рдирд┐рдореНрди рд╣реИ рдЬрдм рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдереЗ ..., рдпрд╣ рдХрдВрд╕реЛрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ... рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЬрди)ред
рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ - рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдХреИрдкреНрдЪрд╛ рдкрд░ рд╕реНрдХреНрд░реВ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЕрдВрдд рдореЗрдВ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ - рдореИрдВ рдПрдХ Google рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ Google рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж (рдмреЗрд╢рдХ рд╕рдм рдХреБрдЫ рдПрдХ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдХреЛрдИ рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдореЗрд▓рдмреЙрдХреНрд╕, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдореБрдлреНрдд рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдореЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ:
def sendMail(account, body): mail.send_mail(sender = "rzd wrapper support <robot.sender.rzd@gmail.com>", to = account.email(), subject = "train report", html = body, body = body)
рд╣рд╛рдВ, рдкрд╛рда рдкреНрд░рд╕реНрддреБрддрд┐ рдФрд░ HTML рдореЗрдВ рдкрддреНрд░ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд▓реНрдж рд╣реА рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред
рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐
рд░реЗрдбрд┐рдпреЛрдзрд░реНрдореА рд╕реНрд░реЛрдд рдЕрднреА рднреА рд╣реИрдВ , рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдЪреАрдЬреЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рдбрд╛рд▓реВрдВрдЧрд╛, рджреБрд░реНрд▓рдн рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдЪрд╛рд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрд░рдЬреЗрдбреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рдореИрдВ рддрдиреЗ рд░рдЦ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рдлреА рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ, рд╕реНрд░реЛрдд рд╕реЗ рд╣рд░ рдХреЛрдИ рдЕрдкрдирд╛ рд╕реНрдерд╛рдиреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрд░реЛрди рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЯрд┐рдХрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд▓рд╣рд╛рд▓, рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЯреНрд░реЗрди рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдХреА рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ,
рдЬрд┐рдВрдЬрд╛ 2 рдХреЛ рддреЗрдЬ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рдмрдирд╛рдПрдВ , рдмрд╕
рд╕реНрд░реЛрдд рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЛ
рдЦреЛрд▓рдиреЗ рдФрд░ рд╡рд░реНрддрдиреА рдкрд░реАрдХреНрд╖рдХ рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП APPENGINE рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕реЗрд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред