Как указать, что логин требуется где-то, кроме представления в Django? - PullRequest
1 голос
/ 31 января 2010

Итак, у меня есть приложение под названием stats, которое позволяет мне различными способами запрашивать мою базу данных и возвращать информацию в формате JSON, чтобы у меня была хорошая панель управления ajaxy для построения графиков и визуализации. Естественно, я бы хотел, чтобы это приложение было максимально пригодным для повторного использования, поэтому я не хочу обязательно использовать декоратор @login_required для своих представлений. В моем случае, однако, я делаю хочу, чтобы вход был необходим перед просмотром любого из представлений приложений. Есть ли способ сделать это где-нибудь, кроме представлений?

Возможно, что-то подобное в моем сайте urls.py? (Я знаю, что это не сработает, пример того, что я ищу)

urlpatterns = patterns('',
        (r'^stat/', include('stats.urls'), login_required), 
)

Ответы [ 3 ]

6 голосов
/ 31 января 2010

Вы можете применить декоратор для отдельных URL в urls.py следующим образом:

from django.contrib.auth.decorators import login_required
import views

(r'^stat/', login_required(views.index))
3 голосов
/ 31 января 2010

вы можете использовать промежуточное ПО для этого

вот пример фрагмента - http://www.djangosnippets.org/snippets/1179/

вы можете использовать этот фрагмент и определить LOGIN_EXEMPT_URLS в ваших настройках или немного изменить его для вашего случая

2 голосов
/ 31 января 2010

Если вы беспокоитесь о возможности повторного использования, вместо использования login_required, вы можете использовать декоратор, который требует входа в систему, если в представление передается определенный аргумент (который может по умолчанию принимать значение True). С моей головы это может выглядеть примерно так:

from django.contrib.auth.decorators import login_required

def login_possibly_required(view_func):
    def inner(request, *args, **kwargs):
        try:
            require_login = kwargs.pop('require_login')
            if require_login:
                return login_required(view_func)(request, *args, **kwargs)
        except KeyError:
            pass
        return view_func(request, *args, **kwargs)
    return inner

Тогда вы бы определили свои взгляды так:

@login_possibly_required
my_view(request, arg1, arg2, require_login=True):
    pass

Не проверено, но вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...