рд╕рдВрд╕рд╛рдзрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ HTTP рд╕рд░реНрд╡рд░ рдХрд╛ рдЕрдиреБрдХреВрд▓рдиред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд╡рд┐рдзрд╛рдПрдБ

  1. рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рд╛рд░
  2. рдкреГрд╖реНрда рд▓реЛрдб рдмрдирд╛рдо рдордЬрдмреВрд░ рддрд╛рдЬрд╝рд╛
  3. рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  4. рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
  5. рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдЕрдиреБрдХреВрд▓рди
  6. рд╕реБрд╡рд┐рдзрд╛рдПрдБ google app рдЗрдВрдЬрди
  7. рд╕реНрд░реЛрдд рдХреЛрдб
  8. рд╕рд╛рд░рд╛рдВрд╢


Google App Engine / Python рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рд╛рд░


рдпрд╛рд╣реВ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕рд┐рджреНрдз рд▓реЗрдЦ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ HTTP рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рд╣реИ ... рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдмрд╕ HTML рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 < img src="image.jpg" > 


рдПрдХ рдмрд╛рд░ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред рдХреИрд╢ рдореЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ HTML рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рдЙрд╕реА рдЫрд╡рд┐ рдХрд╛ рд▓рд┐рдВрдХ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред

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

 < img src="image.v250.jpg" > 


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

 //  ,     Expires: Fri, 30 Oct 2050 14:19:41 GMT //       Cache-Control: max-age=12345678, public 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, umpteenth рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдкреГрд╖реНрда рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ HTML рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХрдИ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкреГрд╖реНрда рд▓реЛрдб рдмрдирд╛рдоред рдордЬрдмреВрд░рди рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ


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

рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ "image.v250.jpg" рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕рдХреА рдХреИрд╢ рдореЗрдВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реИ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реЗрдбрд░ рдХреЛ "рдЗрдлрд╝-рд╕рдВрд╢реЛрдзрд┐рдд-рдЪреВрдВрдХрд┐: рд╢реБрдХреНрд░, 01 рдЬрдирд╡рд░реА 1990 00:00:00 GMT" рднреЗрдЬрддрд╛ рд╣реИред рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реЗрдбрд░ рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЙрддреНрддрд░ рдХреЛ рдкрд╣рд▓реЗ "рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛" рдХреЗ рд▓рд┐рдП рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рджреВрд╕рд░реЗ рдХреЛ рдЪрд┐рддреНрд░ рджреЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд╛рд░реАрдЦ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдХреИрд╢ рдореЗрдВ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рддрдереНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рддрд╕реНрд╡реАрд░ рд╕рд╣реА рд╣реИ (рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдЕрджреНрд╡рд┐рддреАрдп URL рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░рдг)ред

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

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

рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рддрдХрдиреАрдХ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред GAE / django рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд╕реНрдЯрдо рдЯреИрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:

 < img src="{% static 'image.jpg' %}" > 


HTML рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ:

 < img src="/never-expire/12345678/image.jpg" > 


рдФрд░ рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреИрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

 def static(path): return StaticFilesInfo.get_versioned_resource_path(path) register.simple_tag(static) 


рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


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

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

 # Some previous version of resource requested - redirect to the right version correct_path = StaticFilesInfo.get_resource_path(resource) if self.request.path != correct_path: self.redirect(correct_path) return 


рдлрд┐рд░ рд╡рд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:
- рдлрд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдВрдЯреЗрдВрдЯ-рдЯрд╛рдЗрдк
- рдПрдХреНрд╕рдкрд╛рдпрд░, рдХреИрд╢-рдХрдВрдЯреНрд░реЛрд▓, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

 if 'If-Modified-Since' in self.request.headers: # This flag means the client has its own copy of the resource # and we may not return it. We won't. # Just set the response code to Not Changed. self.response.set_status(304) else: time.sleep(1) # todo: just making resource loading process noticeable abs_file = os.path.join(os.path.split(__file__)[0], WHERE_STATIC_FILES_ARE_STORED, resource) transmit_file(abs_file, self.response.out) 


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

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдЕрдиреБрдХреВрд▓рди


рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк VCS рд╕реЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрддрд┐рдо рдЕрджреНрдпрддрди рдХреЗ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреЛрдИ рдмреБрдирд┐рдпрд╛рджреА рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рджреВрд╕рд░рд╛ рдЪреБрдирд╛, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд░рд▓:

 os.path.getmtime(file) 


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

 { 'cover.jpg': 123456, 'style.css': 234567 } 


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

 class StaticFilesInfo(): @classmethod def __get_static_files_info(cls): info = memcache.get(cls.__name__) if info is None: info = cls.__grab_info() time = MEMCACHE_TIME_PRODUCTION if is_production() else MEMCACHE_TIME_DEV_SERVER memcache.set(cls.__name__, info, time) return info @classmethod def __grab_info(cls): """ Obtain info about all files in managed 'static' directory. This is done rarely. """ dir = os.path.join(os.path.split(__file__)[0], WHERE_STATIC_FILES_ARE_STORED) hash = {} for file in os.listdir(dir): abs_file = os.path.join(dir, file) hash[file] = int(os.path.getmtime(abs_file)) return hash 


Google рдРрдк рдЗрдВрдЬрди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


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

рд▓реЗрдХрд┐рди рдРрдк рдЗрдВрдЬрди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдорд╛рдкреНрдд рдХреЛрдб (рдФрд░ рд╕реНрдерд┐рд░ рдлрд╛рдЗрд▓реЗрдВ) рддреИрдирд╛рдд (рддреИрдирд╛рдд) рд╣реЛрддреА рд╣реИрдВред рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдм (рдЕрдЧрд▓реА рддреИрдирд╛рддреА рддрдХ) рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЕрдм рдХреЛрдИ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╕рдорд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб


code.google.com/p/investigations/source/browse/#svn%2Ftrunk%2Fnever-expire-http-resources

svn рдЪреЗрдХрдЖрдЙрдЯ рдЬрд╛рдВрдЪ .googlecode.com/svn/trunk/never-expire-http-resource рдЬрд╛рдБрдЪ

рд╕рд╛рд░рд╛рдВрд╢


рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ appspot рдкрд░ рдЕрдкрд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рд▓реЛрдЧ, рдЧреНрд░рд╛рд╣рдХ-рд╕рд░реНрд╡рд░ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВ, рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг 200 рдареАрдХ рдЬрд╡рд╛рдм рди рджреЗрдВ :)

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

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


All Articles