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

рджреЛрд╕реНрддреЛрдВ, рдорд╛рд░реНрдЪ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рдо "рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрдЯрд┐рд╕реНрдЯ" рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░ рдПрдХ рдирдИ рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЕрднреА, рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкрд░рд┐рдЪрдп

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

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



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

рд╕рд╛рдордЧреНрд░реА

  1. рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдкред
  2. рдПрдкреАрдЖрдИ рдХреНрдпрд╛ рд╣реИ?
  3. рдкрд╛рдпрдерди рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реАред
  4. рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ред
  5. рд╕реЗрд╡рд┐рдВрдЧ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓реНрд╕: рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдПрдВрдб рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рдиред
  6. рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛ред

рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдкред

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

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

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

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

рдПрдкреАрдЖрдИ рдХреНрдпрд╛ рд╣реИ?

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

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


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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди API рдкреНрд░рджрд╛рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ Google рдЕрдкрдиреЗ Google рд╡рд┐рдЬрд╝рди API рдХреЗ рд╕рд╛рде рд╣реИ ред

рд╕рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдмрд╕ Google рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрддреНрдд рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░рдИрдПрд╕рдЯреА (рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд░рд╛рдЬреНрдп рд╕реНрдерд╛рдирд╛рдВрддрд░рдг) рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк Google рд╡рд┐рдЬрд╝рди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

рдкрд╛рдпрдерди рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реАред

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

  • рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдорд┐рдиреАрдХреЛрдиреНрдбрд╛ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдорд┐рд▓реЗрдЧрд╛;
  • wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
  • bash Miniconda3-latest-Linux-x86_64.sh
  • рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдХреНрд░рдо рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
  • source .bashrc
  • рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ: conda , рдЖрдк рдЙрдкрд▓рдмреНрдз рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдПрдХ рдирдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рдХрд░реЗрдВ: conda create --name <environment-name> python=3.6
  • рдЙрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рджрд░реНрдЬ рдХрд░реЗрдВ: source activate <environment-name>
  • рдЖрд╡рд╢реНрдпрдХ рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдХреБрдкреНрдкреА рдФрд░ рдЕрдВрдЧрд░рдЦрд╛ред

2) рд╣рдо рдЕрдкрдиреЗ рд╕рд╛рдзрд╛рд░рдг "рд╣реЗрд▓реЛ рд╡рд░реНрд▓реНрдб" рдлреНрд▓рд╛рд╕реНрдХ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ ред

  • рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рдЦреЛрд▓реЗрдВ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ hello-world.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
  • рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦреЗрдВ:

 """Filename: hello-world.py """ from flask import Flask app = Flask(__name__) @app.route('/users/<string:username>') def hello_world(username=None): return("Hello {}!".format(username)) 

  • рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд▓реМрдЯреЗрдВред
  • рдПрдкреАрдЖрдИ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ gunicorn --bind 0.0.0.0:8000 hello-world:app : gunicorn --bind 0.0.0.0:8000 hello-world:app
  • рдпрджрд┐ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИрдВ:



  • рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдирд┐рдореНрди рджрд░реНрдЬ рдХрд░реЗрдВ: https://localhost:8000/users/any-name



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

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

рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ред

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

 import os import json import numpy as np import pandas as pd from sklearn.externals import joblib from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.base import BaseEstimator, TransformerMixin from sklearn.ensemble import RandomForestClassifier from sklearn.pipeline import make_pipeline import warnings warnings.filterwarnings("ignore") 

  • рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ:

 !ls /home/pratos/Side-Project/av_articles/flask_api/data/ 

 test.csv training.csv 

 data = pd.read_csv('../data/training.csv') 

 list(data.columns) 

 ['Loan_ID', 'Gender', 'Married', 'Dependents', 'Education', 'Self_Employed', 'ApplicantIncome', 'CoapplicantIncome', 'LoanAmount', 'Loan_Amount_Term', 'Credit_History', 'Property_Area', 'Loan_Status'] 

 data.shape 


 (614, 13) 
ul>
рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╢реВрдиреНрдп / рдиреИрди рдорд╛рди рдЦреЛрдЬреЗрдВ:

 for _ in data.columns: print("The number of null values in:{} == {}".format(_, data[_].isnull().sum())) 


 The number of null values in:Loan_ID == 0 The number of null values in:Gender == 13 The number of null values in:Married == 3 The number of null values in:Dependents == 15 The number of null values in:Education == 0 The number of null values in:Self_Employed == 32 The number of null values in:ApplicantIncome == 0 The number of null values in:CoapplicantIncome == 0 The number of null values in:LoanAmount == 22 The number of null values in:Loan_Amount_Term == 14 The number of null values in:Credit_History == 50 The number of null values in:Property_Area == 0 The number of null values in:Loan_Status == 0 

  • рдЕрдЧрд▓рд╛ рдХрджрдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рд╕реЗрдЯ рдмрдирд╛рдирд╛ рд╣реИ:

 red_var = ['Gender','Married','Dependents','Education','Self_Employed','ApplicantIncome','CoapplicantIncome',\ 'LoanAmount','Loan_Amount_Term','Credit_History','Property_Area'] X_train, X_test, y_train, y_test = train_test_split(data[pred_var], data['Loan_Status'], \ test_size=0.25, random_state=42) 

  • рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рд╕рднреА рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЪрд░рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВ, рдФрд░ рд╣рдо рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ (рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реНрдХрд┐рдХрд┐рдЯ-рд▓рд░реНрди рдПрд╕реЗрд▓реЗрдЯрд░) рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕реНрдХрд┐рдЯ-рд▓рд░реНрди рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдмрдирд╛рдПрдВрдЧреЗ ред

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдврд╝реЗрдВред

 from sklearn.base import BaseEstimator, TransformerMixin class PreProcessing(BaseEstimator, TransformerMixin): """Custom Pre-Processing estimator for our use-case """ def __init__(self): pass def transform(self, df): """Regular transform() that is a help for training, validation & testing datasets (NOTE: The operations performed here are the ones that we did prior to this cell) """ pred_var = ['Gender','Married','Dependents','Education','Self_Employed','ApplicantIncome',\ 'CoapplicantIncome','LoanAmount','Loan_Amount_Term','Credit_History','Property_Area'] df = df[pred_var] df['Dependents'] = df['Dependents'].fillna(0) df['Self_Employed'] = df['Self_Employed'].fillna('No') df['Loan_Amount_Term'] = df['Loan_Amount_Term'].fillna(self.term_mean_) df['Credit_History'] = df['Credit_History'].fillna(1) df['Married'] = df['Married'].fillna('No') df['Gender'] = df['Gender'].fillna('Male') df['LoanAmount'] = df['LoanAmount'].fillna(self.amt_mean_) gender_values = {'Female' : 0, 'Male' : 1} married_values = {'No' : 0, 'Yes' : 1} education_values = {'Graduate' : 0, 'Not Graduate' : 1} employed_values = {'No' : 0, 'Yes' : 1} property_values = {'Rural' : 0, 'Urban' : 1, 'Semiurban' : 2} dependent_values = {'3+': 3, '0': 0, '2': 2, '1': 1} df.replace({'Gender': gender_values, 'Married': married_values, 'Education': education_values, \ 'Self_Employed': employed_values, 'Property_Area': property_values, \ 'Dependents': dependent_values}, inplace=True) return df.as_matrix() def fit(self, df, y=None, **fit_params): """Fitting the Training dataset & calculating the required values from train eg: We will need the mean of X_train['Loan_Amount_Term'] that will be used in transformation of X_test """ self.term_mean_ = df['Loan_Amount_Term'].mean() self.amt_mean_ = df['LoanAmount'].mean() return self 

  • y_train рдФрд░ y_test рдХреЛ np.array :

 y_train = y_train.replace({'Y':1, 'N':0}).as_matrix() y_test = y_test.replace({'Y':1, 'N':0}).as_matrix() 

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

 pipe = make_pipeline(PreProcessing(), RandomForestClassifier()) 

 pipe 

 Pipeline(memory=None, steps=[('preprocessing', PreProcessing()), ('randomforestclassifier', RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False))]) 

рдЙрдкрдпреБрдХреНрдд рд╣рд╛рдЗрдкрд░ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ (рдмрд╣реБрдкрдж рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЧреНрд░реА рдФрд░ рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдлрд╛) рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЧреНрд░рд┐рдб рдЦреЛрдЬ рдХрд░реЗрдВрдЧреЗ (рдЧреНрд░рд┐рдб рдЦреЛрдЬ рд╢рдмреНрдж:

  • Param_grid рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

 param_grid = {"randomforestclassifier__n_estimators" : [10, 20, 30], "randomforestclassifier__max_depth" : [None, 6, 8, 10], "randomforestclassifier__max_leaf_nodes": [None, 5, 10, 20], "randomforestclassifier__min_impurity_split": [0.1, 0.2, 0.3]} 

  • рдЧреНрд░рд┐рдб рдЦреЛрдЬ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ:

 grid = GridSearchCV(pipe, param_grid=param_grid, cv=3) 

  • рд╣рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЕрдиреБрдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 grid.fit(X_train, y_train) 

 GridSearchCV(cv=3, error_score='raise', estimator=Pipeline(memory=None, steps=[('preprocessing', PreProcessing()), ('randomforestclassifier', RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impu..._jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False))]), fit_params=None, iid=True, n_jobs=1, param_grid={'randomforestclassifier__n_estimators': [10, 20, 30], 'randomforestclassifier__max_leaf_nodes': [None, 5, 10, 20], 'randomforestclassifier__min_impurity_split': [0.1, 0.2, 0.3], 'randomforestclassifier__max_depth': [None, 6, 8, 10]}, pre_dispatch='2*n_jobs', refit=True, return_train_score=True, scoring=None, verbose=0) 

  • рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЧреНрд░рд┐рдб рдкрд░ рдЦреЛрдЬ рдХрд╛ рдХреМрди рд╕рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ:

 print("Best parameters: {}".format(grid.best_params_)) 

 Best parameters: {'randomforestclassifier__n_estimators': 30, 'randomforestclassifier__max_leaf_nodes': 20, 'randomforestclassifier__min_impurity_split': 0.2, 'randomforestclassifier__max_depth': 8} 

  • рд╣рдо рдЧрдгрдирд╛:

 print("Validation set score: {:.2f}".format(grid.score(X_test, y_test))) 

 Validation set score: 0.79 

  • рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:

 test_df = pd.read_csv('../data/test.csv', encoding="utf-8-sig") test_df = test_df.head() 

 grid.predict(test_df) 

 array([1, 1, 1, 1, 1]) 

рдЕрдЧрд▓реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЕрдЪреНрдЫреА рд▓рдЧрддреА рд╣реИ: рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рдХреЛ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдирд╛ред

рд╕реЗрд╡рд┐рдВрдЧ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓: рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдПрдВрдб рдбрд┐рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рдиред

"рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ, рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреНрд░рдорд╛рдВрдХрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЗрдЯреНрд╕ рдХреЛ рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рд╛рд░реВрдк (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдореЗрдореЛрд░реА рдмрдлрд░) рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрд╕реА рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред"


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

 list_to_pickle = [1, 'here', 123, 'walker'] #Pickling the list import pickle list_pickle = pickle.dumps(list_to_pickle) 

 list_pickle 

 b'\x80\x03]q\x00(K\x01X\x04\x00\x00\x00hereq\x01K{X\x06\x00\x00\x00walkerq\x02e.' 

рдлрд┐рд░ рд╣рдо рдбрд┐рдмреНрдмрд╛рдмрдВрдж рд╡рд╕реНрддреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрддрд╛рд░рддреЗ рд╣реИрдВ:

 loaded_pickle = pickle.loads(list_pickle) 

 loaded_pickle 

 [1, 'here', 123, 'walker'] 

рд╣рдо рдбрд┐рдмреНрдмрд╛рдмрдВрдж рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ .rda рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВред

рдиреЛрдЯ: рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд░рдХреНрд╖рдг рд╡рд┐рдзрд┐ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдПрдХ рд╡рд┐рдХрд▓реНрдк h5py рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╕реНрдЯрдо рдХреНрд▓рд╛рд╕ (рдХреНрд▓рд╛рд╕) рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреНрд░рд┐рдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рд╕ рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП dill рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб рд╡рд╛рд▓реА рдПрдХ рдЕрд▓рдЧ training.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдЙрдЪрд┐рдд рд╣реИред (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ )ред

  • dill рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

 !pip install dill 

 Requirement already satisfied: dill in /home/pratos/miniconda3/envs/ordermanagement/lib/python3.5/site-packages 

 import dill as pickle filename = 'model_v1.pk' 

 with open('../flask_api/models/'+filename, 'wb') as file: pickle.dump(grid, file) 

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

 with open('../flask_api/models/'+filename ,'rb') as f: loaded_model = pickle.load(f) 

 loaded_model.predict(test_df) 

 array([1, 1, 1, 1, 1]) 

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

рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛

рдЪрд▓реЛ рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд░рдЦреЗрдВ:



apicall() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рд╣реИрдВ:

  • request рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛);
  • рдбрд┐рдмреНрдмрд╛рдмрдВрдж рдореВрд▓реНрдпрд╛рдВрдХрдХ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ;
  • JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ status code: 200 рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ status code: 200 ;

HTTP рд╕рдВрджреЗрд╢ рд╣реЗрдбрд░ рдФрд░ рдмреЙрдбреА рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЦреНрдп рдирд┐рдХрд╛рдп рд╕рд╛рдордЧреНрд░реА JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ ( POST url-endpoint/ ) рднреЗрдЬреЗрдВрдЧреЗред

рдиреЛрдЯ: рдЖрдк рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╡рд┐рдирд┐рдореЗрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд╕рд╛рджреЗ рдкрд╛рда, XML, cvs рдпрд╛ рдПрдХ рдЪрд┐рддреНрд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ JSON рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

 """Filename: server.py """ import os import pandas as pd from sklearn.externals import joblib from flask import Flask, jsonify, request app = Flask(__name__) @app.route('/predict', methods=['POST']) def apicall(): """API Call Pandas dataframe (sent as a payload) from API Call """ try: test_json = request.get_json() test = pd.read_json(test_json, orient='records') #To resolve the issue of TypeError: Cannot compare types 'ndarray(dtype=int64)' and 'str' test['Dependents'] = [str(x) for x in list(test['Dependents'])] #Getting the Loan_IDs separated out loan_ids = test['Loan_ID'] except Exception as e: raise e clf = 'model_v1.pk' if test.empty: return(bad_request()) else: #Load the saved model print("Loading the model...") loaded_model = None with open('./models/'+clf,'rb') as f: loaded_model = pickle.load(f) print("The model has been loaded...doing predictions now...") predictions = loaded_model.predict(test) """Add the predictions as Series to a new pandas dataframe OR Depending on the use-case, the entire test data appended with the new files """ prediction_series = list(pd.Series(predictions)) final_predictions = pd.DataFrame(list(zip(loan_ids, prediction_series))) """We can be as creative in sending the responses. But we need to send the response codes as well. """ responses = jsonify(predictions=final_predictions.to_json(orient="records")) responses.status_code = 200 return (responses) 

рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рджрд░реНрдЬ рдХрд░реЗрдВ: gunicorn --bind 0.0.0.0:8000 server:app
рдЖрдЗрдП https:0.0.0.0:8000/predict рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдФрд░ рдПрдХ рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

 import json import requests 

 """Setting the headers to send and accept json responses """ header = {'Content-Type': 'application/json', \ 'Accept': 'application/json'} """Reading test batch """ df = pd.read_csv('../data/test.csv', encoding="utf-8-sig") df = df.head() """Converting Pandas Dataframe to json """ data = df.to_json(orient='records') 

 data 

 '[{"Loan_ID":"LP001015","Gender":"Male","Married":"Yes","Dependents":"0","Education":"Graduate","Self_Employed":"No","ApplicantIncome":5720,"CoapplicantIncome":0,"LoanAmount":110.0,"Loan_Amount_Term":360.0,"Credit_History":1.0,"Property_Area":"Urban"},{"Loan_ID":"LP001022","Gender":"Male","Married":"Yes","Dependents":"1","Education":"Graduate","Self_Employed":"No","ApplicantIncome":3076,"CoapplicantIncome":1500,"LoanAmount":126.0,"Loan_Amount_Term":360.0,"Credit_History":1.0,"Property_Area":"Urban"},{"Loan_ID":"LP001031","Gender":"Male","Married":"Yes","Dependents":"2","Education":"Graduate","Self_Employed":"No","ApplicantIncome":5000,"CoapplicantIncome":1800,"LoanAmount":208.0,"Loan_Amount_Term":360.0,"Credit_History":1.0,"Property_Area":"Urban"},{"Loan_ID":"LP001035","Gender":"Male","Married":"Yes","Dependents":"2","Education":"Graduate","Self_Employed":"No","ApplicantIncome":2340,"CoapplicantIncome":2546,"LoanAmount":100.0,"Loan_Amount_Term":360.0,"Credit_History":null,"Property_Area":"Urban"},{"Loan_ID":"LP001051","Gender":"Male","Married":"No","Dependents":"0","Education":"Not Graduate","Self_Employed":"No","ApplicantIncome":3276,"CoapplicantIncome":0,"LoanAmount":78.0,"Loan_Amount_Term":360.0,"Credit_History":1.0,"Property_Area":"Urban"}]' 

 """POST <url>/predict """ resp = requests.post("http://0.0.0.0:8000/predict", \ data = json.dumps(data),\ headers= header) 

 resp.status_code 

 200 

 """The final response we get is as follows: """ resp.json() 

 {'predictions': '[{"0":"LP001015","1":1},{... 

рдирд┐рд╖реНрдХрд░реНрд╖

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

рдПрдкреАрдЖрдИ рдмрдирд╛рддреЗ рд╕рдордп рдХреБрдЫ рдмрд╛рддреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

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

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

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг

рдЙрдкрдпреЛрдЧреА рд╕реНрд░реЛрдд:

[рез] рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рди рдЪреБрдиреЗрдВред
[реи] рдмрд┐рд▓реНрдбрд┐рдВрдЧ рд╕реНрдХрд┐рдЯрд┐рдЯ рд╕рдВрдЧрдд рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рд╕реАрдЦреЗрдВ ред
[рей] рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ jsonify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ред
[рек] рдлреНрд▓рд╛рд╕реНрдХ-рдХреНрд╡рд┐рдХрд╕реНрдЯрд╛рд░реНрдЯред

рдпрд╣рд╛рдБ рдРрд╕реА рд╕рд╛рдордЧреНрд░реА рд╣реИред рдкреНрд░рдХрд╛рд╢рди рдкрд╕рдВрдж рдЖрдпрд╛ рддреЛ рд╣рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВ, рдФрд░ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдореБрдлреНрдд рдУрдкрди рд╡реЗрдмрд┐рдирд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд░реЗрдВ: "рдореИрдЯреНрд░рд┐рдХ рд╡рд░реНрдЧреАрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо", рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдФрд░ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рджреНрд╡рд╛рд░рд╛ 12 рдорд╛рд░реНрдЪ рдХреЛ 5 рд╕рд╛рд▓ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдирд┐рдХрд┐рддрд┐рди ред

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


All Articles