Какова противоположность @login_required декоратора для представлений Django?

Если я хочу удостовериться, что представление перечислено, поскольку имеющий открытый доступ, там декоратор, эквивалентный @public_access, который был бы противоположностью @login_required и прояснил бы, что представление должно всегда быть публично доступным?

Один вариант использования, который я имею в виду, состоит в том, чтобы автоматически добавить "@csrf_exempt" ко всему общественному мнению в дополнение к прояснению в коде, что представление должно быть публично доступным.

12
задан MikeN 12 February 2010 в 18:51
поделиться

2 ответа

К сожалению, в настоящее время в Django нет встроенной поддержки для этого, что подвергает вас риску раскрытия конфиденциальной информации. когда @login_required случайно забыт.

Вот решение из одного из моих проектов:

middleware / security.py :

def public(function):
    """Decorator for public views that do not require authentication
    """
    orig_func = function
    while isinstance(orig_func, partial):  # if partial - use original function for authorization
        orig_func = orig_func.func
    orig_func.is_public_view = True

    return function

def is_public(function):
    try:                                    # cache is found
        return function.is_public_view
    except AttributeError:                  # cache is not found
        result = function.__module__.startswith('django.') and not function.__module__.startswith('django.views.generic') # Avoid modifying admin and other built-in views

        try:                                # try to recreate cache
            function.is_public_view = result
        except AttributeError:
            pass

        return result


class NonpublicMiddleware(object):

    def process_view_check_logged(self, request, view_func, view_args, view_kwargs):
        return

    def process_view(self, request, view_func, view_args, view_kwargs):
        while isinstance(view_func, partial):  # if partial - use original function for authorization
            view_func = view_func.func

        request.public = is_public(view_func)
        if not is_public(view_func):
            if request.user.is_authenticated():     # only extended checks are needed
                return self.process_view_check_logged(request, view_func, view_args, view_kwargs)

            return self.redirect_to_login(request.get_full_path())  # => login page

    def redirect_to_login(self, original_target, login_url=settings.LOGIN_URL):
        return HttpResponseRedirect("%s?%s=%s" % (login_url, REDIRECT_FIELD_NAME, urlquote(original_target)))

settings.py :

MIDDLEWARE_CLASSES = (
    #...
    'middleware.security.NonpublicProfilefullMiddleware',
    #...
)

и, наконец, просмотр кода:

from <projname>.middleware import publi

@public
def some_view(request):
    #...

# Login required is added automatically
def some_private_view(request):
    #...

Кроме того, вы возможно, вы захотите посмотреть «Автоматическое оформление всех представлений проекта django» сообщение в блоге

11
ответ дан 2 December 2019 в 18:53
поделиться

"Вход в систему не требуется" по умолчанию. Если вы хотите отметить, что представление никогда не должно быть ограничено входом в систему, вы должны сделать это в строке документации.

0
ответ дан 2 December 2019 в 18:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: