Как использовать регистр регистра Flask-Security?
Кто-нибудь использовал расширение Flask-Security
для аутентификации? Как получить доступ к регистру для работы?
http://packages.python.org/Flask-Security/customizing.html
Я имею в виду ссылку выше.
@app.route('/register', methods=['GET'])
def register():
return render_template('security/register_user.html')
Я не хочу расширять класс по умолчанию, я просто хочу обернуть представление регистрации по умолчанию в моем макете сайта, чтобы я это сделал.
{% extends "layout.html" %}
{% block title %}upload{% endblock %}
{% block body %}
{% from "security/_macros.html" import render_field_with_errors, render_field %}
{% include "security/_messages.html" %}
<h1>Register</h1>
<form action="{{ url_for_security('register') }}" method="POST" name="register_user_form">
{{ register_user_form.hidden_tag() }}
{{ render_field_with_errors(register_user_form.email) }}
{{ render_field_with_errors(register_user_form.password) }}
{% if register_user_form.password_confirm %}
{{ render_field_with_errors(register_user_form.password_confirm) }}
{% endif %}
{{ render_field(register_user_form.submit) }}
</form>
{% include "security/_menu.html" %}
{% endblock %}
И я получаю следующую ошибку?
werkzeug.routing.BuildError
BuildError: ('security.register', {}, None)
Ответы
Ответ 1
Вам не нужно создавать представление. По умолчанию он включен в Flask-Security.
Вам просто нужно включить его в конфигурацию вашего флеш-приложения:
app = Flask(__name__)
app.config['SECURITY_REGISTERABLE'] = True
При этом маршрут "/register" должен работать.
Для изменения URL-адреса есть другое значение конфигурации:
app.config['SECURITY_REGISTER_URL'] = '/create_account'
Другую информацию о конфигурации Flask-Security можно найти здесь:
http://pythonhosted.org/Flask-Security/configuration.html
Ответ 2
Я действительно не использовал Flask-Security, но Builderror ссылается на то, что фляжка не может привязать представление security.register к URL-адресу. безопасность - это название проекта. Поэтому я могу предложить вам попытаться вызвать вид следующим образом. Вместо app.route используйте security.route.
@security.route('/register', methods=['GET'])
def register():
return render_template('security/register_user.html')
Ответ 3
Ответ от @dcr полезен, но я хотел бы немного уточнить его и сделать некоторые вещи, которые подразумеваются только здесь и в документации.
Flask-Security поставляется с представлениями по умолчанию (также называемыми маршрутами). Многие из них можно включить с помощью переменных конфигурации -ABLE
, например:
app.config["SECURITY_REGISTERABLE"] = True
У вас есть выбор: либо включить и использовать вид по умолчанию, либо оставить его отключенным и использовать вместо него свой. Когда вы включаете представление, вы не можете переопределить его. Когда вы думаете об этом, это имеет смысл. Зачем включать представление, если вы просто планируете использовать собственную реализацию? Как колба должна знать, какой маршрут использовать? И с другой стороны: если представление отключено, его конечная точка не будет работать.
Если вы используете представление по умолчанию, вы можете создать URL для него, используя, например, url_for('security.register')
(или url_for_security('register')
в старом стиле). Flask-Security также будет искать шаблон в security/TEMPLATE_NAME.html
и использовать его для отображения формы, если она существует. Это позволяет вам вносить визуальные изменения и оборачивать форму в вашем интерфейсе по желанию.
Итак, теперь должно быть понятно, почему Werkzeug жалуется. Попробуйте запустить flask routes
в командной строке и посмотрите на результат. Вы увидите что-то вроде этого:
(venv) ⋊> ~/flaskapp on master ⨯ flask routes
Endpoint Methods Rule
-------------------------- --------- ------------------------------------------
index GET /
register GET /register
security.login GET, POST /login
security.logout GET /logout
[...]
Обратите внимание, что конечная точка security.register
не существует, потому что вы не включили REGISTERABLE
. Таким образом, url_for('security.register')
потерпит неудачу.
Ваш вид не делает ничего особенного, он просто отображает шаблон. Вот почему @dcr правильно говорит, что вам не нужно создавать представление. Пусть Flask-Security сделает это за вас, полностью удалив ваш /register
маршрут и включив REGISTERABLE
. Поскольку вы правильно назвали шаблон register_user.html
и поместили его в templates/security/
, Flask-Security будет использовать его для отображения страницы с формой по умолчанию (или любой другой формой, которую вы предоставили, когда объект безопасности был init
).
Тем не мение! Если код, который у вас есть, это просто заполнитель, и вам нужно каким-то образом манипулировать формой или страницей перед отображением или когда пользователь нажимает кнопку "Отправить", то вам нужно ваше собственное представление. В этом случае вам не следует включать REGISTERABLE
, но это также означает, что security.register
не будет доступен для использования в url_for()
. Вместо этого вы будете использовать просто 'register'
(или '{bp_name}.register'
если ваш регистрационный код находится в Blueprint). Кроме того, вам не нужно называть свою страницу каким-либо конкретным именем, потому что вы не полагаетесь на чью-либо реализацию представления. Вы можете положить его в папку с шаблонами и назвать его register.html
. Какой бы путь вы ни выбрали, вам нужно будет передать его в render_template()
в вашем методе view.
Спасибо @drahoja9 в этом ответе, который, наконец, дал мне понять.