2011-01-26 3 views
2

Это похоже на простой вопрос, но я не могу найти простой ответ. Кажется, Django дает этот отличный простой способ ограничить доступ к местам, используя требуемые разрешения или необходимые декорации для входа в систему, но я не могу видеть из документов Django, как можно передать сообщение об ошибке (возможно, используя структуру сообщений). Если мне нужно катить свой декоратор, чтобы сделать это, в чем смысл декораторов джанго? Они просто не отображают сообщений об ошибках?Django - декораторы и сообщения об ошибках

+0

Вы прочитали документацию? Они перенаправляются на страницу входа в систему. –

ответ

-1

Я предполагаю, что вы просто избегать чтения этого

http://docs.djangoproject.com/en/1.2/topics/auth/#the-login-required-decorator

login_required() выполняет следующие действия:

Если пользователь не вошел в систему, перенаправлять к settings.LOGIN_URL, передавая текущий абсолютный путь в запросе строка. Пример: /accounts/login/?next=/polls/3/.

Если пользователь вошел в систему, выполните нормально просмотр . Код просмотра является бесплатным , чтобы предположить, что пользователь выполнил вход в систему.

Нет «сообщений об ошибках». Сообщения об ошибках являются грубыми. И в значительной степени бесполезно. Они часто являются признаком плохого дизайна.

Как правило, вам не нужны миллионные небольшие пояснения. Действительно, страница входа по умолчанию работает отлично для 80% случаев использования. Если вам необходимо уточнить ситуацию, вы можете предоставить свою собственную HTML-форму. Вы можете использовать обычный контекст шаблона, чтобы добавить дополнительную информацию. У вас есть Messages Framework для представления дополнительных сообщений на странице входа.

+0

Я читал это, спасибо. Многие веб-сайты, требующие регистрации, перенаправляют вас с сообщением об ошибке, вы должны войти в систему, чтобы просмотреть эту страницу. Вы говорите, что у меня должна быть только html-страница с целью отображения «вы должны войти» и другую страницу html для отображения «у вас нет разрешения»? Мне это кажется глупым.Если вы можете перенаправить обратно на свою домашнюю страницу, на которой есть форма входа в систему, и просто укажите сообщение, в котором говорится: «Пожалуйста, войдите» или «у вас нет правильного разрешения», что сделало бы больше смысла – JPC

+0

Возможно, для чего-то простого как, нужно войти в систему, но что, если вам нужно определенное разрешение на доступ к чему-то, и вы вошли в систему, но не имеете требуемого разрешения. Разве не имеет смысла отображать какое-то сообщение о том, какое разрешение вам нужно? – JPC

+0

@JPC: «Разве не было бы смысла отображать какое-то сообщение о том, какое разрешение вам нужно?» На самом деле, нет. Они не разрешены, и именно так разработан сайт. Если им нужно разрешить, им либо потребуется другое имя пользователя, либо им нужно позвонить в службу поддержки. Это не тонкости. Разрешения должны быть простыми и очевидными. –

0

Вы послали пользователю автоматическое сообщение об ошибке .. Вы должны были бы смотреть, как на излишнее ездить ..

+0

Вы имеете в виду переопределение декораторов и создание собственного? – JPC

2

Я думаю, что вы объединяете безопасность и разрешения с системой аутентификации Django. По большей части инструменты Django в основном предназначены для разделения пользователей на две группы: аутентифицированные (вошли в систему) и анонимные. Это имеет смысл для 90% веб-сайтов, так как вам не нужна слишком большая дифференциация (может быть, другая для скрытого администратора, но это крайний случай, а не норма).

Декоратор permission_required - очень простой крючок для людей, желающих перенаправить людей, у которых не было разрешений, чтобы перейти на страницу входа. Однако в какой-то момент этого недостаточно. Если вам требуется определенное разрешение, и у пользователя его нет, как их перенаправлять на страницу входа?

В этом случае так легко свернуть собственный декоратор, используя сообщения для конкретных ошибок. Один такой пример:

def user_has_permissions(method): 
    return user_passes_test(lambda u: u.has_perm('my_permission'), login_url='/permission-denied/')(method) 
+0

Я полагаю, что это был бы лучший вариант. Я заметил, что в django docs login_required поддерживает только login_url в версии разработки (1.2 не поддерживает его). Но в 1.2, login_url поддерживается для декодеров разрешений. Почему? – JPC

Смежные вопросы