Django рдХреЗ рдкрд╛рд╕ рдПрдХ рд╢рд╛рдирджрд╛рд░ etag/condition/last_modified рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИред рдпрд╣ рдбреАрдЖрд░рдПрдл рд╡рд░реНрдЧ-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде 'рдЧреЗрдЯ' рдХреЛ рд╕рдЬрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ get рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ http рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ etag рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЗрд╕реЗ рдбреАрдЖрд░рдПрдл рдХреЗ рднреАрддрд░ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рд╕рдВрд╕рд╛рдзрди, рдпрд╛ рдПрдХ рджреГрд╢реНрдп (рдпрд╛ рдПрдХ рдорд┐рд╢реНрд░рдг) рдкрд░ рдПрдХ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╡рд┐рдзрд┐ рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдИрдЯреИрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
django рдореЗрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рддрд░рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреГрд╢реНрдп рдХреЗ рд╢рд░реАрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╢реЙрд░реНрдЯрдХрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреИрдЪ рд╣реИ: 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
рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЙрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рдорд┐рд▓рд╛!
рдореИрдВрдиреЗ 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
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ drf-рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ Etag рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗрд╡рд▓ рдЧрд▓рдд рдФрд░ рдЦрддрд░рдирд╛рдХ рд░реВрдк рд╕реЗ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИред рдЕрдЧрд░ _request_ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдпрд╣ Etag рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рди рдХрд┐ _response_ рдмрджрд▓рдиреЗ рдкрд░ред рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдк рдареАрдХ рдпрд╣реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдареАрдХ рд╡рд╣реА рдЬреЛ рдЖрдк Etag рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред