рд╣рдо рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ login_required рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╛рди рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦрд╛ рд╣реИ (рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЯреЛрдХрд░реА рдЦрд╛рд▓реА рд╣реИ)ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЗрд╕рдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛ рдФрд░, рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╛ рддреЛ рдПрдХ рджреГрд╢реНрдп рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╣реЗрдВрдЧреЗред
рдЪреВрдВрдХрд┐ рдпреЛрдЬрдирд╛ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП "рд░рд┐рдХреНрдд" рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
def check_decorator(view=None, condition_func = lambda request, *args, **kwargs: True, false_func = lambda request, *args, **kwargs: HttpResponse()): ''' Checks by :function:condition_func, if true go to :function: view, else go to :function:false_func :param condition_func: Should return Boolean value :type condition_func: function :param false_func: Should return object of :class:`http.HttpResponse' :return: :class:`http.HttpResponse` ''' def decorator(view): @wraps(view) def wrapper(request, *args, **kwargs): if not condition_func(request, *args, **kwargs): return false_func(request, *args, **kwargs) return view(request, *args, **kwargs) return wrapper return decorator(view) if view else decorator
check_decorator рдПрдХ рдмреЗрд╕рд┐рдХ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рджреГрд╢реНрдп, рдПрдХ рдХрдВрдбреАрд╢рди рдлрдВрдХреНрд╢рди (condition_func), рдФрд░ рдПрдХ рдлрдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрдЧрд░ рдХрдВрдбреАрд╢рди рдиреЗрдЧреЗрдЯрд┐рд╡ (false_func) рджреЗрддрд╛ рд╣реИред
рдЕрдм, рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрдкрдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЦрд╛рддреЗ рдореЗрдВ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ (рдкрдВрдЬреАрдХрд░рдг рд╕реЗ рдорд╛рди рд▓реАрдЬрд┐рдП), рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдЙрдард╛рдиреЗ рдЪрд╛рд╣рд┐рдП:
- рдмрдирд╛рдПрдБ is_anonymous рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (office_redirect)
- рдлрдВрдХреНрд╢рдирд▓реВрд▓рд╢рд┐рдк рдФрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ (is_anonymous, office_redirect) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗ
from functools import partial is_anonymous = lambda request, *args, **kwargs: request.user.is_anonymous() office_redirect = lambda request, *args, **kwargs: redirect('office')
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдХрдВрдбреАрд╢рди рдлрдВрдХреНрд╢рди рдпрд╛ рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛, рдЬрд┐рд╕реЗ рдХрдВрдбреАрд╢рди рди рдорд┐рд▓рдиреЗ рдкрд░ (рдЭреВрдареА_рдлрдВрдХ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_url рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдХрд╣рд╛рдВ рднреЗрдЬреЗрдВрдЧреЗ:
@login_required(redirect_url=reverse_lazy('my_view_name')) def some_view(request, *args, **kwargs): pass
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдЧрд▓рдд_рдлрдВрдХ рд╣рдореЗрд╢рд╛ рдЕрдиреБрдкреНрд░реЗрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ url рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЖрдЗрдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдорд╛рд░реЗ "рд╡рд░реНрдХрдкреАрд╕" рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдмрдирд╛рдПрдВ:
def redirect_decorator(view=None, redirect_url=None, **kwargs): ''' Uses :function:`check_decorator` with false_func that returns :param:`redirect_url` ''' assert not redirect_url is None, "Redirect_url should be set" if 'false_handle_func' in kwargs: del kwargs['false_func'] redirect_func = lambda request, *args, **kwargs: redirect(redirect_url) return check_decorator(view=view, false_func=redirect_func, **kwargs)
Redirect_decorator рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ redirect_url рд╣рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╡реЗ рд╣рдореЗрдВ рдкрд╛рд╕ рдХрд░ рдЧрдП рд╣реИрдВ
false_func - рдЗрд╕реЗ рд╣рдЯрд╛рдПрдВред рдлрд┐рд░ рд╣рдо check_decorator рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
should_be_anonymous = partial(redirect_decorator, condition_func=is_anonymous)
рдФрд░ рдЙрд╕ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
@should_be_anonymous(redirect_url=reverse_lazy('office')) def some_view(request, *args, **kwargs): pass
рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ
Django рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд
django.messages рд╕рдВрджреЗрд╢
рддрдВрддреНрд░ рд╣реИ , рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
from django.contrib import messages def view(request, *args, **kwargs): ... messages.info("Hello World!")
рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ:
{% if messages %} <ul> {% for message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %}
рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рдкрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЖрдпрд╛ред
рдЖрдЗрдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдФрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛:
def redirect_message_decorator(view=None, message=None, redirect_url=None, **kwargs): ''' Uses :function: c`check_decorator` with false_func thar returns :param:`redirect_url` ''' assert not redirect_url is None, "Redirect_url should be set" assert not message is None, "Message should be set" if 'false_func' in kwargs: del kwargs['false_func'] def redirect_func(request, *args, **kwargs): messages.info(request, message) return redirect(redirect_url) return check_decorator(view=view, false_func=redirect_func, **kwargs)
рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде should_be_anonymous рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
should_be_anonymous = partial(redirect_message_decorator, condition_func=is_anonymous)
рдФрд░ рдЗрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ:
@should_be_anonymous(message=u' ', redirect_url=reverse_lazy('office')) def some_view(request, *args, **kwargs): pass
рдирд┐рд╖реНрдХрд░реНрд╖
рдЖрдк рдЗрд╕
рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ
рд╕реАрдмреАрд╡реА рдХреЗ рд╕рд╛рде рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
редрд▓реЗрдЦ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред
рд╣рд░ рдХреЛрдИ рдЕрджреНрднреБрдд django рдврд╛рдВрдЪреЗ рдХреЛ рд╕реАрдЦрдиреЗ / рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ / рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЖрдирдВрдж рд▓реЗрддрд╛ рд╣реИред