Все мы так делаем, и если вы новичок, вам необходимо принять во внимание следующие особенности регистрации по электронной почте.
Надежная система регистрации по электронной почте необходима для веб-приложений, информационных бюллетеней, бесплатной загрузки, приглашений в частные группы и привлечения потенциальных клиентов. Давайте не будем полагаться на использование сторонних сервисов, таких как Auth0, Facebook или Google, для доступа к вашему приложению. Сохраняйте данные своего приложения!
Для начала вам необходимо иметь некоторый опыт работы с Python, поскольку мы собираемся использовать фреймворк Flask с базой данных MySQL. Это будет веселее, чем использовать Wordpress, самую популярную CMS. Вам придется заплатить за какой-нибудь плагин Wordpress, чтобы иметь те же возможности, что и бесплатное расширение Flask. Ранее я создавал оба приложения и предпочитаю Python Flask для веб-приложений, хотя Wordpress вполне способен создавать веб-приложения.
Каждый фрагмент кода будет объяснен и снабжен некоторыми комментариями. Если вы еще не создали систему регистрации пользователей или не знаете внутренней работы, я опишу вам детали. Вот краткое описание функций, которые мы реализуем, как указано в первом абзаце:
Действительный адрес электронной почты можно проверить, проанализировав входную строку пользователя с помощью регулярного выражения или расширения Flask. Мы не допустим хаков с произвольным текстом или SQL-инъекций.
Защиту от ботов можно выполнить с помощью скрытого поля, которое не отображается пользователю, но обычно автоматически заполняется ботами, сканирующими уязвимые формы регистрации.
Метод двойного согласия требует, чтобы получатель дал разрешение вам отправлять ему электронные письма, получив ссылку для подтверждения на его почтовый ящик. В основном это используется для предотвращения использования вашего адреса электронной почты кем-либо другим. Это также предотвращает пользователей, которые просто зарегистрировались и покинули свои учетные записи.
Давайте напишем код!
Создайте рабочий каталог:
mkdir signup cd signup
Создайте среду Python, используя python3 -m venv Signup или conda create -n Signup python3. Я предпочитаю конду.
Создайте таблицу MySQL для хранения ваших пользователей. Проверенное поле предназначено для двойного согласия:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(120) NOT NULL UNIQUE, password VARCHAR(120) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, validated BOOLEAN DEFAULT FALSE );
Установить зависимости:
pip flask flask-mail secure SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python
Альтернативно, вы можете указать то же самое в файле требований.txt и запустить pip install -r require.txt
Создайте файл app.py со следующими зависимостями:
from flask import Flask, render_template, request, url_for, redirect, flash from flask_mail import Mail, Message from datetime import datetime from flask_sqlalchemy import SQLAlchemy from sqlalchemy.sql import func from itsdangerous import URLSafeTimedSerializer, SignatureExpired from werkzeug.security import generate_password_hash, check_password_hash import secrets
Введите данные конфигурации вашего сервера, используя следующие строки:
# Flask configurations secret = secrets.token_urlsafe(32) app.secret_key = secret app.config['SECRET_KEY'] = secret # auto-generated secret key # SQLAlchemy configurations SQLALCHEMY_DATABASE_URI = 'mysql mysqlconnector://admin:user@localhost/tablename' # Email configurations app.config['MAIL_SERVER'] = 'smtp.example.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USERNAME'] = '[email protected]' app.config['MAIL_PASSWORD'] = 'your_password' app.config['MAIL_USE_TLS'] = True app.config['MAIL_USE_SSL'] = False db = SQLAlchemy(app) mail = Mail(app) s = URLSafeTimedSerializer(app.config['SECRET_KEY']) #set secret to the serliazer
В конечном итоге информация о вашей конфигурации должна храниться в файле .env.
В следующем разделе используется структура ORM SQLAlchemy для запроса базы данных. Обратите внимание, что имя класса должно совпадать с именем таблицы вашей базы данных, иначе вы получите сообщение об ошибке. Модель db.model представляет настройки вашей таблицы, которые включают имя столбца, его тип, длину, ключ и нулевое значение:
class User(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(120), nullable=False) created_at = db.Column(db.DateTime, server_default=db.func.now()) validated = db.Column(db.Boolean, default=False)
Если вы еще не создали таблицу базы данных MySQL вручную, вы можете сделать это с помощью этого кода Flask непосредственно после блока кода пользователя класса:
# Create the database table with app.app_context(): db.create_all()
Для краткости этого руководства мы пропустим индексную страницу или то, что вы хотите назвать домашней страницей вашего приложения, и просто покажем страницу регистрации, используя функцию декоратора Python для маршрута страницы:
@app.route('/') def index(): return 'Homepage
' @app.route('/signup', methods=['GET', 'POST']) def signup(): if request.method == 'POST': # Hidden field validation to prevent bot submission hidden_field = request.form.get('hidden_field') if hidden_field: return redirect(url_for('index')) # Bot detected, ignore submission email = request.form['email'] password = request.form['password'] hashed_password = generate_password_hash(password, method='sha256') # Insert user into the database new_user = User(email=email, password=hashed_password) db.session.add(new_user) db.session.commit() # Send confirmation email token = s.dumps(email, salt='email-confirm') msg = Message('Confirm your Email', sender='[email protected]', recipients=[email]) link = url_for('confirm_email', token=token, _external=True) msg.body = f'Your link is {link}' mail.send(msg) flash('A confirmation email has been sent to your email address.', 'success') return redirect(url_for('index')) return render_template('signup.html')
Прежде чем добавлять HTML-форму регистрации, давайте завершим серверную часть, добавив маршрут для проверки функции двойного согласия. В этом маршруте используется переменная s, которую мы создали ранее, которая генерирует чувствительный ко времени секретный токен. Подробности смотрите в документации
Максимальный возраст — это секунды до истечения срока действия ссылки, поэтому в этом случае у пользователя есть 20 минут, чтобы подтвердить свой адрес электронной почты.
@app.route('/confirm_email/') def confirm_email(token): try: email = s.loads(token, salt='email-confirm', max_age=1200) # Token expires after 1 hour except SignatureExpired: return ' The token is expired!
' # Update field in database user = User.query.filter_by(email=email).first_or_404() user.validated = True db.session.commit() return 'Email address confirmed!
'
Теперь, что касается вездесущего основного оператора, который сообщает Python о необходимости выполнения сценария, если файл выполняется напрямую (в отличие от импортированного модуля):
if __name__ == '__main__': app.run(debug=True)
Прежде чем мы завершим этот внутренний код, нам все еще нужен внешний HTML-код для ввода данных пользователем. Мы собираемся сделать это с помощью встроенного шаблона Jinja Flask. Создайте файл с именем templates/signup.html, имя которого должно совпадать с маршрутом, который вы создали ранее в app.py. По умолчанию Jinja использует каталог /templates для файлов html. Вы можете изменить этот параметр, но в этом уроке мы будем использовать каталог /templates приложения.
{% with messages = get_flashed_messages(with_categories=true) %} {% if messages %}Email Sign Up Sign Up
Ваш код должен работать с этого момента, когда вы запускаете команду flask с включенной отладкой. Это позволит вам увидеть любые ошибки в командной строке, а также в окне браузера:
flask --app app.py --debug run
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3