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
from functools import partial is_anonymous = lambda request, *args, **kwargs: request.user.is_anonymous() office_redirect = lambda request, *args, **kwargs: redirect('office') # office - view urls should_be_anonymous = partial(check_decorator, condition_func=is_anonymous, false_func=office_redirect)
@login_required(redirect_url=reverse_lazy('my_view_name')) def some_view(request, *args, **kwargs): pass
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)
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
from django.contrib import messages def view(request, *args, **kwargs): ... messages.info("Hello World!") # p ...
{% 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 = 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
Source: https://habr.com/ru/post/145709/
All Articles