Django рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ

рдПрдХ рдмрд╛рд░ рдореБрдЭреЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ django-app рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд░реВрдк, рддрд░реАрдХреЗ рдФрд░ рдмрд╛рдХреА рд╕рдм рдереЗред рдФрд░, рдХрд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдЦрдХ рдиреЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рд╕реНрдкреИрдорд░реНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдпрд╛ F5 рдХреЛ рднрд╛рд░реА рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рд╕реЗ рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХреАред рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдХрд╛рдВрдЯреЗ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрдИ рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдмреБрд░реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдХреНрд╕реАрдЬрди рдореЗрдВ рдХрдЯреМрддреА рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рддреНрдордХ


рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдиреНрдпрд╛рд╕ рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', 'congestion': 'forum.views.congestion', 'django.contrib.admin.options.change_view': { 'post': False, 'all': None, 'uri': '/admin/forum/post/23/', }, } 

рдХрдЯ рдХреЗ рдиреАрдЪреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгред

рд╕реНрдерд╛рдкрдирд╛


 git clone http://github.com/night-crawler/django-throttling.git cd django-throttling python setup.py install 


рдЧреНрд▓реЛрдмрд▓ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ

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

 DJANGO_THROTTLING = { 'all': 1000, 'post': 10000, 'congestion': 'forum.views.congestion', } 

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

 def congestion(request, congestion_bundle): user = request.user progress = int(float(congestion_bundle['delta']) / congestion_bundle['timeout'] * 100) c = Context({'user': user, 'congestion_bundle': congestion_bundle, 'progress': progress}) return render_to_response(get_theme_template(user, 'congestion.html'), c, context_instance=RequestContext(request) ) 


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

рдЖрдк рдкреВрд░реА рд╕рд╛рдЗрдЯ рдкрд░ POST рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ HttpResponseBadRequest рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 DJANGO_THROTTLING = { 'all': 1000, 'post': False, 'congestion': 'forum.views.congestion', } 


рдФрд░ рдЖрдк рдЗрд╕ рддрд░рд╣ POST рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд░реВрдЯ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛:

 DJANGO_THROTTLING = { 'all': 1000, 'post': '/', 'congestion': 'forum.views.congestion', } 


рдпрджрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд░рдЦрд░рдЦрд╛рд╡-рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 DJANGO_THROTTLING = { 'all': 1000, 'post': 'forum.views.maintenance', 'congestion': 'forum.views.congestion', } # forum.views.maintenance def maintenance(request, maintenance_bundle): return HttpPreResponse(maintenance_bundle) 


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

 DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', #    callable: 'congestion': 'forum.views.congestion', } # helpers.trash.my_callback' def my_callback(request, view_func, view_args, view_kwargs): return 'some_strange_key_123', 10000 


рдпрд╣ рдХреБрдВрдЬреА рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ рдЯрдкрд▓ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯрд╛рдЗрдордЖрдЙрдЯ рдлрд┐рд░ рд╕реЗ int (), рдЧрд▓рдд, рджреГрд╢реНрдп рдпрд╛ uri рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдерд╛рдиреАрдп рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ

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

 DJANGO_THROTTLING = { 'all': 1000, 'post': 'callable:helpers.trash.my_callback', 'congestion': 'forum.views.congestion', 'django.contrib.admin.options.change_view': { 'post': False, 'all': None, 'uri': '/admin/forum/post/23/', # 'post': 'callable:helpers.trash.my_callback', # 'all': 4000, }, } 


рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ:

  1. DJANGO_THROTTLING_ENABLED : рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрджред
  2. DJANGO_THROTTLING_CACHE_EXPIRE : рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╢ рдореЗрдВ рдХрд┐рддрдиреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 60 * 60 рд╣реИред
  3. DJANGO_THROTTLING_CACHE_PREFIX : рдХреИрд╢ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕, рдбрд┐рдлрд╝реЙрд▓реНрдЯ "рдереНрд░реЛрдЯрд▓рд┐рдВрдЧ" рд╣реИ
  4. THROTTLING_CACHE_KEY_PATTERNS : рдХреБрдВрдЬреА рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЯрд░реНрди рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдХреБрд▓ 4 рдХрд┐рд╕реНрдореЗрдВ рд╣реИрдВ: view_method, view, site_method, рд╕рд╛рдЗрдЯред рдЖрдк рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  5. DJANGO_THROTTLING_IGNORE_ADMIN : рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╣реИ рддреЛ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯреЗрдб рдСрд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рдЧреАрдереВрдм рдкрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╡рд░реНрдгрди рд╣реИред

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


All Articles