Django-rest-framework: рдЖрд╕рд╛рдиреА рд╕реЗ рдИрдЯреИрдЧ рдЬреЛрдбрд╝реЗрдВ/рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЬреВрди 2011  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: encode/django-rest-framework

Django рдХреЗ рдкрд╛рд╕ рдПрдХ рд╢рд╛рдирджрд╛рд░ etag/condition/last_modified рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИред рдпрд╣ рдбреАрдЖрд░рдПрдл рд╡рд░реНрдЧ-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде 'рдЧреЗрдЯ' рдХреЛ рд╕рдЬрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ get рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ http рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ etag рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

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

django рдореЗрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рддрд░рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреГрд╢реНрдп рдХреЗ рд╢рд░реАрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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

рд╕рднреА 24 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреИрдЪ рд╣реИ: https://github.com/schinckel/django-rest-framework/commit/cc3a88edc6be21347a9b35929d158b8831ba9bd3

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд╢ рд╣реИрдВред

рдареАрдХ рд╣реИ, рддреЛ, рд╢реБрд░реВ рдореЗрдВ рдореИрдВрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╡рд╣ рдпрд╣ рдерд╛...

рдмрдврд╝рд┐рдпрд╛, рд╣рд╛рдБ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдпреБрдЧрд▓ рд╡рд┐рдЪрд╛рд░ - рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореМрдЬреВрдж View._ETAG рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ View.add_header рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
(рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .add_header рдХреЛ рд╢рд╛рдпрдж ResponseMixin рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред)

рджреВрд╕рд░реЗ, рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ @condition , @etag рдФрд░ @last_modified рд╕рдЬрд╛рд╡рдЯ рд╢рд╛рдпрдж https://github.com/django/django/blob/master/django/views/decorators рдХрд╛ рдПрдХ рд╕реАрдзрд╛-рд╕реАрдзрд╛ рдХреНрд▓реЛрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд▓реЗрдХрд┐рди рдЪреАрдЬреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ ...

рдФрд░ рд╢рд╛рдпрдж рдмрд╛рдж рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ ...

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд░рдИрдПрд╕рдЯреА рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдПрдЪрдЯреАрдкреАрд░реЗрд╕реНрдкреЙрдиреНрд╕ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдмрд╕ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдордЧреНрд░реА рд╡рд╛рд░реНрддрд╛/рдХреНрд░рдордмрджреНрдз рд╕рд╛рдордЧреНрд░реА рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред @last_modified , @etag рдФрд░ @condition рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдЦрд╛рд▓реА HttpResponses рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рддреЛ, рдореИрдВ рдХреНрдпрд╛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдЕрдЧрд░ рд╣рдордиреЗ рдХреЗрд╡рд▓ __setitem__ __getitem__ рдФрд░ has_header рдХреЛ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Django рдХрд╛ рдореМрдЬреВрджрд╛ @last_modified , @etag рдФрд░ @condition рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ REST рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡реНрдпреВ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП _рдЬрдм рддрдХ рдХрд┐ рд╡реНрдпреВ return Response(status, data) рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рдмрдЬрд╛рдп return data рд╕реНрдЯрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛред

рдУрдмреАрд╡реА рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рджреЛрд╣рд░рд╛рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ Django рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рддрд╛ рд╣реИред

рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?

django рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ: рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдХреЗрд╡рд▓ рдирдВрдЧреЗ рдХрд╛рд░реНрдпред рдореИрдВрдиреЗ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦрд╛ рдерд╛, рд╡рд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд┐рд▓реЗ рдПрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ред

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд╣рдХрд░, рдореИрдВ рд╡рд╛рдкрд╕реА рдбреЗрдЯрд╛ рд╢реИрд▓реА рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ, рдФрд░ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЬреЗрд╕рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╣рдо рдЗрд╕реЗ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдПрдХ рдорд┐рдХреНрд╕рд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрдиреНрд╣реЗрдВ рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рднреА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ django рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╕рд╢рд░реНрдд PUT, POST рдФрд░ DELETE рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╕ рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдирд╛рддреНрд░рд╛ рдХреЛ рдПрдХ рдкреИрдЪ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ред

рдЖрдЦрд┐рд░реА рдмрд┐рдЯ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ: рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдареАрдХ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рдерд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдБ рдПрдХ рдмрд┐рдВрджреБ рд╣реИ: рд╡реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ _methods_ рдкрд░ рдПрдЯреАрдПрдо рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд 'рд╕реНрд╡рдпрдВ' рддрд░реНрдХ рд╣реИред рдореИрдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛ рдФрд░ Django рдХреЛ рдЯрд┐рдХрдЯ рдЬрдорд╛ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реАрдмреАрд╡реА рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ...

рдЖрд╣, рдареАрдХ рд╣реИ - рдореБрдЭреЗ рдЕрдм @method_decorator рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ... https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating -class -based-views
рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡
  2. рдХреБрдЫ рд╣рд▓реНрдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЙрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рдорд┐рд▓рд╛!

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

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

https://bitbucket.org/vitormazzi/django-rest-framework/changeset/6f8de4500c6f

рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдХреБрдЫ рдирдП рдЬреАрд╡рди рдХреА рд╕рд╛рдВрд╕ рд▓реЗрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рд╣рдо 2.x рд░рд┐рд▓реАрдЬ рдкрд░ рд╣реИрдВред

рдпрд╣рд╛рдВ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред

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

рд╡рд┐рдЪрд╛рд░реЛрдВ

рдкреНрд░рд╛рдкреНрдд
GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЙрдкрдпреБрдХреНрдд рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ ETag рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред RetrieveModelMixin рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ:

def retrieve(self, request, *args, **kwargs):
    self.object = self.get_object()
    serializer = self.get_serializer(self.object)
    headers = {'ETag': self.object.etag}
    return Response(serializer.data, headers=headers)

рдкреБрдЯ, рдкреИрдЪ, рдбрд┐рд▓реАрдЯ
HTTP рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдВрдЪ рджреГрд╢реНрдп рдХреЗ dispatch рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрд╛ рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдЦреАрдВрдЪреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдИрдЯреИрдЧ рдЪрд╛рд▓реВ рд╣реИрдВ (рдиреАрдЪреЗ рд╡рд┐рдХрд▓реНрдк рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ):

    header_etag = request.META.get('HTTP_IF_MATCH')
    if header_etag is None:
        return Response({'error': 'IF_MATCH header is required'}, status=400)

рдлрд┐рд░ рд╡рд╕реНрддреБ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдВрдЪ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рджреЗрдЦ рд░рд╣рд╛ рд╣реИ:

    if self.object.etag != header_etag:
        return Response({'error': 'object has been updated since you last saw it'}, status=412)

рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреВрдард╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡

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

рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рдбреАрдЖрд░рдПрдл рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ obj.etag рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реАрдмреАрд╡реА рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП get_etag() рдФрд░ etag_var = 'get_my_objects_etag' ред

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

рд╡рд┐рдХрд▓реНрдк

  • рдИрдЯреИрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЪрд╛рд▓реВ рдпрд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ (рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдЖрджрд┐ рдХреЗ рд╕рд╛рде)ред
  • рджреГрд╢реНрдпреЛрдВ рдкрд░ рджреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕:

    • use_etags (рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣) - рдПрдХ рдмреВрд▓рд┐рдпрди

    • etag_var - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рд╢реНрди рдореЗрдВ рд╡рд╕реНрддреБ рдкрд░ getattr рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@ghickman - рдореИрдВ рдЕрдиреНрдп рдкреНрд▓рдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рдИрдЯреИрдЧ рдФрд░ рд▓рд╛рд╕реНрдЯрдореЛрдбрд┐рдлрд╛рдЗрдб рд▓реБрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрд░реНрдерд╛рддред рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ:

class MyView(views.APIView):
    cache_lookup_classes = []

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

  • рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рджрд┐рдП рдЧрдП рдПрдХ рдИрдЯреИрдЧ рдФрд░/рдпрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрд┐рдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред
  • рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдИрдЯреИрдЧ рдФрд░/рдпрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрд┐рдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред

рдПрдХ BaseCacheLookup , рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

.object_etag_and_last_modified(self, view, obj)
.preemptive_etag_and_last_modified(self, view, request, *view_kwargs, **view_kwargs)

рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП (etag, last modified) рджреЛ-рдЯреБрдкрд▓ рд▓реМрдЯрд╛рдПрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдмрд╕ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЗрдл-рдореЙрдбрд┐рдлрд╛рдЗрдб-рд╕реЗ рдпрд╛ рдЗрдл-рдиреЛ-рдореИрдЪ рд╣реЗрдбрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ 304 рдиреЙрдЯ рдореЙрдбрд┐рдлрд╛рдЗрдб рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЗрдл-рдореИрдЪ рдпрд╛ рдЗрдл-рдЕрдирдореЙрдбрд┐рдлрд╛рдЗрдб-рд╕реЗ рд╣реИ рддреЛ 412 рдкреВрд░реНрд╡ рд╢рд░реНрдд рд╡рд┐рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рдПрдЧреАред

рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ CacheLookupClass рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд░реВрдкреЛрдВ рдХреЛ рднреАред

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

рдХреНрдпрд╛ рдЗрд╕ рдХрд╛ рдкреНрд▓рдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдкрдХреНрд╖ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реИ?

рдореИрдВрдиреЗ LastModified рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

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

рдореИрдВ etag рдФрд░ last_modified рдкреАрдврд╝реА рдХреЛ рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ (рдЙрди рдирд╛рдореЛрдВ рдореЗрдВ рд╕реЗ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛, рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ None рд▓реМрдЯрд╛рдПрдВред CacheLookup рдмреИрдХрдПрдВрдб рддрдм рдПрдХ рдФрд░/рдпрд╛ рджреВрд╕рд░реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪреБрди рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрджреНрдзрддрд┐ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( cachable_obj_repr рдпрд╛ unique_obj_repr рд╢рд╛рдпрдж?)

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

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдореИрдВрдиреЗ рдЕрдкрдиреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА http://chibisov.github.io/drf-extensions/docs/ рдореЗрдВ рдИрдЯреИрдЧ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред

@рдЪрд┐рдмрд┐рд╕реЛрд╡ рдиреАрдЯреЛ ред рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #1019 рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдХреЗрдЬ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рдореЗрдВ рдХрд╣реАрдВ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред

рдЗрд╕реЗ #1019 рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ @chibisov рдХрд╛ рдкреИрдХреЗрдЬ рд╕реВрдЪреАрдмрджреНрдз рд╣реИред

рдпрд╣ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ 3.3 рдХреЗ рд░реВрдк рдореЗрдВ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕ рдкрд░ рдХреБрдЫ рдФрдкрдЪрд╛рд░рд┐рдХ рдирд┐рд░реНрджреЗрд╢ рджреЗрдВред рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЪреБрдирддреЗ рд╣реИрдВ рддреЛ рдЕрддрд┐-рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдЖрдВрддрд░рд┐рдХ рд░реЛрдбрдореИрдк рдкрд░ рд░рд╣рд╛ рд╣реИред

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

@mbox рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ drf-рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкрд░ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рдЬрд╛рдП рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ DRF "рдХреЛрд░" рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдЦреБрд▓рд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реЛрдЧреАред

@mbox @xordoquy
рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА drf-рдПрдХреНрд╕рдЯреЗрдВрд╢рди (https://github.com/chibisov/drf-extensions/pull/171) рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдбреАрдЖрд░рдПрдл рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢рд╛рд╡рд╛рджреА рд╕рдорд╡рд░реНрддреА рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдРрдк рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рдпрдерди 2.7, 3.4, 3.5 рдХреЗ рд╕рд╛рде DRF>=3.3.1 рдФрд░ django>=1.8 рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж

рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдиреЛрдЯ - рдореИрдВрдиреЗ рдбреАрдЖрд░рдПрдл рдХреЗ рд╕рд╛рде Django рд╕реЗ рд╕рд╢рд░реНрдд рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рдкреИрдХреЗрдЬ рдмрдирд╛рдпрд╛ рд╣реИред рддреЛ рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
https://github.com/jozo/django-rest-framework-condition

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

orf picture orf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rjdp picture rjdp  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ryankask picture ryankask  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

synic picture synic  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

akhilputhiry picture akhilputhiry  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ