рдЬрдм рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдорд╡реАрд╕реА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ

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

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

рдпрд╣рд╛рдБ рдХрдИ рдмрд┐рдВрджреБ рд╣реИрдВ:
  1. рдПрдХ рддрд░рдл, рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рд╣рдорд╛рд░реЗ рд╕рд╛рде рдПрдХ рд╣реА рд╡рд┐рднрд╛рдЧ рдореЗрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЗрдВрдЯреАрд░рд┐рдпрд░ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреА рдЕрдЪреНрдЫреА рдХрдорд╛рди рд╣реИ, рдереЛрдбрд╝рд╛ рд╕рд╛ рдПрдЪрдЯреАрдПрдордПрд▓ рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрд╛рдпрдерди, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Django рдирд╣реАрдВред
    рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рд╣рдореЗрдВ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╕реНрддрд┐рд╖реНрдХ рдкрд░ рд▓реЛрдб рд╕реЗ рд░рд╛рд╣рдд рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЙрдирдХреЗ рдХрд╛рдо рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рддреНрд░реБрдЯрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗред
  2. рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдореЗрдВ рдХрд╛рдлреА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд░реВрдк рдореЗрдВ рдХрдИ рд░рд┐рдкреЛрд░реНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреГрд╖реНрда рд╣реИрдВ рдФрд░ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ (рдареАрдХ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЗ)
    рдпрджрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рддрд░реНрдХ рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдмрдбрд╝реА рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрдВ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


    рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ "рдХреБрдЫ" рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдкреВрд░реЗ рддрд░реНрдХ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

  3. Django рдХреЛ рд░рд┐рдмреВрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  4. рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╕рд╣рдпреЛрдЧ рдФрд░ рдЯреНрд░реИрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдерд╛ред рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЯреНрд░реИрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдЗрдВрдЬрди рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдЧрд╛, рдФрд░ рдбреЗрдЯрд╛ рдпреЛрдЬрдирд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╢рд╛рдпрдж рдХрд┐рд╕реА рднреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд░реНрджрдирд╛рдХ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдлрд╛рдЗрд▓реЗрдВред рдЬреЛ рдЗрдВрдЬрди рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдкрдврд╝реЗрдЧрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ред рдкреНрд░рд╛рд░реВрдк рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдФрд░ JSON, рдФрд░ ini, рдФрд░ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░реЗрдВред XML рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдПрдХ рд╢рд╛рдо рдпрд╣ рдореБрдЭ рдкрд░ рдЫрд╛ рдЧрдпрд╛ - рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдмреБрд░рд╛ рд╣реИ? рд╕реЗрдЯрдЕрдк рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ (рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдкрд╣рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдЙрд╕реЗ рдЬрд╛рджреБрдИ рд▓рдЧреЗрдВрдЧреА):
# -*- coding: utf-8 -*- from statistics import OracleSelect, Chart, Table select_traf = OracleSelect('user/password@DB', """select DAY, NSS_TRAF, BSS_TRAF from DAY_TRAFFIC where DAY >= trunc(sysdate,'dd')-32""") chart_traf = Chart(selector=select_traf, x_column='DAY', y_columns=[('NSS_TRAF', u'NSS '), ('BSS_TRAF', u'BSS ')]) table_traf = Table(selector=select_traf, columns=['DAY', 'NSS_TRAF', 'BSS_TRAF']) template = """ {{ chart_traf }} {{ table_traf }} """ 
рджрд░рдЕрд╕рд▓, рдЪрд╛рд░реНрдЯ рдФрд░ рдЯреЗрдмрд▓ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдореЛ рдХреЛрдб рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

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

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛ (рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛)

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ "рджреБрднрд╛рд╖рд┐рдпрд╛" рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
 import os from django.template import RequestContext, Template from django.http import HttpResponse, Http404 from settings import PROJECT_ROOT #   ,    __file__   settings.py def dynamic_page(request, report_path): ctx_dict = {} execfile(os.path.join(PROJECT_ROOT, 'reports', report_path + '.py'), ctx_dict) templ_header = '{% extends "base.html" %}{% block content %}' templ_footer = '{% endblock %}' template = Template(templ_header + ctx_dict['template'] + templ_footer) context = RequestContext(request) context.autoescape = False context.update(ctx_dict) return HttpResponse(template.render(context)) 

рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдЪрд░ ctx_dict рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рд╣реЛрдВрдЧреЗред рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЪрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкреВрд░реНрдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдорд╛рдирдХ RequestContext рдФрд░ рдЙрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рддрд╛рдЬрд╝рд╛ рдмрдирд╛рдП рдЧрдП рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
Urls.py рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 (r'^reports/(?P<report_path>.+)$', 'statistics.views.dynamic_page'), 

рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдФрд░ рдЙрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд╛рд╕рд┐рдВрдЧ

рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рд╢рдмреНрджрдХреЛрд╢ рдкрд╛рд╕ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рдЧреЗрдЯ-рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╕ ctx_dict рдХреЛ рдмрджрд▓ рджреЗрдВ
 def dynamic_page(request, report_path): ctx_dict = {'get': request.GET.get} ... 

рдЕрдм, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЖрдпрд╛рдд рдХреЗ, рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдпрд╣рд╛рдВ рд╣рд░ рдмрд╛рд░ рдЖрдпрд╛рдд рдирдпрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдз рд╣рд░ рдмрд╛рд░ рдирдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЙрд╕реА рд╕рдордп, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рднреА рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд░реНрдЯ рдХреЛ рдЙрд╕рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ html-id рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдирд╛рдо рдХреЛ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ (рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд▓рд┐рдП)ред рдмреЗрд╢рдХ, рдЖрдк рдЗрд╕реЗ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реИрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЕрдзрд┐рдХ рдХреЛрд╖реЗрд░ рдирд╣реАрдВ рд╣реИ
 chart_name = Chart(select, x_col, config, ..., html_id='chart_name') 

рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЗрдВрдЬрди рдХреЗ рдпреВрдЬрд░реНрд╕ рдХреЛ рдЕрдкрдиреА рдЗрдирд╕рд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рддрдирд╛рд╡ рди рджреЗрдВ, рд▓реЗрдХрд┐рди рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ ctx_dict рдХреЗ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдЖрд╡рд╢реНрдпрдХ рдЖрдИрдбреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реИред
  ... execfile(os.path.join(PROJECT_ROOT, 'reports', report_path + '.py'), ctx_dict) for (name, obj) in ctx_dict.items(): if isinstance(obj, (Chart, Table)): obj.html_id = name ... 

Ctx_dict рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рд╣реИред рдЪреВрдБрдХрд┐ рдЗрд╕рдХреЗ рд╕рднреА рдорд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ RequestContext рд╕реЗ рдкрд╛рд░рд┐рдд рд╕рдорд╛рди рдирд╛рдореЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреГрд╖реНрда рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП 'TITLE' рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреА рд╕реЗрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдкрдиреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
 bs = get('bs') if bs is not None: TITLE = u'   %s' % bs 

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

рдЕрдиреНрдп рдпреВрдЖрд░рдПрд▓ рдФрд░ рдмреЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓рд┐рдВрдЧ

рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдпрд╛ рдХрд┐ рдкреЛрд░реНрдЯрд▓ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдХреЗ рд╕рд╛рде рдХрдИ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╡реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдереЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдареАрдХ рд╣реИ, рд░рд┐рдкреЛрд░реНрдЯ рд╕рдореВрд╣реЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдерд╛ред
рддреЛ рдбрд╛рдпрдиреЗрдорд┐рдХ_рдкреЗрдЬ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджреГрд╢реНрдп рд╕реЗ рдПрдХ рджреГрд╢реНрдп рдЬрдирд░реЗрдЯрд░ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреЛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
 import os from django.template import RequestContext, Template from django.http import HttpResponse, Http404 from settings import PROJECT_ROOT from functools import partial def get_param(request, key=None, default=None, as_list=False): if key: if as_list: return request.GET.getlist(key) else: return request.GET.get(key, default) else: return request.GET.lists() class DynamicPage(object): "       " #  view def __init__(self, subpath, # ,   ,       parent_template = "base.html", load_tags = (), #     block_name = 'content', pre_calc = lambda request, context: None, #     execfile post_calc = lambda request, context: None): #     execfile self.templ_header = ('{% extends "' + parent_template + '" %}' + DynamicPage.loading_tags(load_tags) + DynamicPage.block_top(block_name)) self.templ_footer = DynamicPage.block_foot(block_name) self.subpath = subpath self.pre_calc = pre_calc self.post_calc = post_calc @staticmethod def block_top(block_name): if block_name: return "{% block " + block_name + " %}" else: return '' @staticmethod def block_foot(block_name): if block_name: return "{% endblock %}" else: return '' @staticmethod def loading_tags(tags): return ''.join(['{% load ' + tag + ' %}' for tag in tags]) @property def __name__(self): return self.__class__.__name__ #  view def __call__(self, request, pagepath): ctx_dict = self.get_context(request, pagepath) if 'response' in ctx_dict and isinstance(ctx_dict['response'], HttpResponse): return ctx_dict['response'] #    response    #     ,     ,   html- else: template = Template(self.templ_header + ctx_dict['template'] + self.templ_footer) context = RequestContext(request) context.autoescape = False context.update(ctx_dict) return HttpResponse(template.render(context)) def get_context(self, request, pagepath): fullpath = os.path.join(PROJECT_ROOT, self.subpath, pagepath + '.py') if not os.path.exists(fullpath): raise Http404 ctx_dict = {'get': partial(get_param, request), 'request': request} self.pre_calc(request, ctx_dict) execfile(fullpath, ctx_dict) self.post_calc(request, ctx_dict) return ctx_dict 

рдЗрд╕рдиреЗ рд╡рд┐рднрд┐рдиреНрди рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЛрд▓реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рдЧреЗ рд╣реБрдП рдереЗред рдЙрддреНрдкрд╛рджрди рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдирд╣реАрдВ рдмрджрд▓реЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, html_id рд╡рд╛рд▓реЗ рдЙрдкрд░реЛрдХреНрдд рдЦреЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
 def add_html_id(request, context): for (name, obj) in context.items(): if isinstance(obj, (Chart, Table)): obj.html_id = name show_report = DynamicPage('stat_tech/pages', parent_template='stat_tech/base.html', load_tags=['adminmedia', 'jquery', 'chapters'], post_calc=add_html_id) 

рджреВрд╕рд░реЗ рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рджреЛред
 show_weekly = DynamicPage('stat_weekly/pages', parent_template = 'stat_weekly/base.html', load_tags = ['chapters', ' employees'], block_name=None) 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд░рд┐рдкреЛрд░реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реА рдмреНрд▓реЙрдХ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
 template = """ {% block chart %} {{ costs_monthly }} {{ costs_weekly }} {% endblock %} {% block responsible %} {% employee vasily_pupkin %}, {% employee ivan_ivanov %} {% endblock %} """ 

рддреАрд╕рд░реЗ рдореЗрдВ, рдЙрд╕ рдЗрдХрд╛рдИ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреИрд╕реЗ рдФрд░ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдХрд┐ рд╕рдмрдореЗрдиреВ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдирд╛ рд╣реИред
 def add_division(request, context): div = Division.get_by_user(request.user) context['DIVISION'] = div context['SUBMENU'] = calc_goal_submenu(request.path, div) show_goal = DynamicPage('stat_goals/pages', load_tags = ['chapters'], block_name='report', parent_template = 'stat_goals/base.html', pre_calc = add_division) 

Urls рдореЗрдВ, рдЗрди рд╕рднреА рдЖрд╡рд░рдгреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рджреГрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ
  (r'^stat/(?P<pagepath>.+)$', 'stat_tech.views.show_report'), (r'^weeklyreport/(?P<pagepath>.+)$', 'stat_weekly.views.show_weekly'), (r'^goals/(?P<pagepath>.+)$', 'stat_goals.views.show_goal'), 


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

UPD: рдореИрдЬрд┐рдХ 4x рдХреЗ рд╕реБрдЭрд╛рд╡ рдкрд░, __name__ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдбрд╛рдпрдиреЗрдорд┐рдХрдкреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рдирдХрд▓ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

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


All Articles