初心者の場合は、次の電子メール サインアップ機能を考慮する必要があります。
Web アプリ、ニュースレター、景品のダウンロード、プライベート グループへの招待、見込み客発掘には、堅牢な電子メール サインアップ システムが不可欠です。アプリにアクセスするために、Auth0、Facebook、Google などのサードパーティ サービスの使用に依存しないようにしましょう。 アプリのデータを自分のものにしましょう!
まず、MySQL データベースで Flask フレームワークを使用するため、Python の経験が必要です
。これは、最も人気のある CMS である Wordpress を使用するよりも楽しいでしょう。無料の Flask 拡張機能と同じ機能を持たせるには、一部の Wordpress プラグインに料金を支払う必要があります。 Wordpress は Web アプリを作成する能力が非常に高いですが、私は以前両方でビルドしたことがあり、Web アプリには Python Flask を好みます。各コード スニペットについて説明し、コード内にいくつかのコメントを含めます。ユーザー登録を構築したことがない場合、または内部の仕組みを知らない場合のために、詳細を説明します。最初の段落で述べたように実装する機能の概要は次のとおりです。
有効な電子メール アドレス
は、正規表現または Flask 拡張機能を使用してユーザーからの入力文字列を解析することでチェックできます。ランダム テキストや SQL インジェクション タイプのハッキングは許可されません。ボット防止
は、ユーザーには表示されない非表示フィールドを使用して実行できますが、通常は、脆弱なサインアップ フォームを巡回するボットによって自動入力されます。ダブル オプトイン メソッド
では、受信者が受信トレイへの検証リンクを受信して電子メールを送信する許可を与える必要があります。これは主に、他人があなたの電子メール アドレスを使用するのを防ぐために使用されます。これにより、テスト ユーザーがサインアップしただけでアカウントを放棄することも防止されます。コードを書いてみましょう!
作業ディレクトリを作成します:
mkdir signup cd signup
python3 -m venvsignup または conda create -nsignup python3 を使用して Python 環境を作成します。私はコンダの方が好きです。
ユーザーを保存する 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
を実行することもできます。
次の依存関係を含む 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'] = 'your_email@example.com' 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 ファイルに含める必要があります。
次のセクションでは、SQLAlchemy の ORM 構造を使用してデータベースにクエリを実行します。 クラス名はデータベース テーブル名と一致する必要があります
。一致しないとエラーが発生することに注意してください。 db.model は、列名、その型、長さ、キー、null 値を含むテーブル設定を表します:
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 '<h1>Homepage</h1>' @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='your_email@example.com', 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/<token>') def confirm_email(token): try: email = s.loads(token, salt='email-confirm', max_age=1200) # Token expires after 1 hour except SignatureExpired: return '<h1>The token is expired!</h1>' # Update field in database user = User.query.filter_by(email=email).first_or_404() user.validated = True db.session.commit() return '<h1>Email address confirmed!</h1>'
次に、ファイルが (インポートされたモジュールではなく) 直接実行されている場合にスクリプトを実行するように Python に指示するユビキタスな main ステートメントについて説明します。
if __name__ == '__main__': app.run(debug=True)
このバックエンド コードを完了する前に、ユーザー入力用のフロントエンド HTML がまだ必要です。 Flask の組み込みの Jinja テンプレートを使用してこれを実行します。 templates/signup.html という名前のファイルを作成します。このファイルは、app.py で前に作成したルートと名前が一致する必要があります。デフォルトでは、Jinja は HTML ファイル用にディレクトリ /templates を使用します。この設定は変更できますが、このチュートリアルでは、アプリの /templates ディレクトリを使用します。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Email Sign Up</title> </head> <body> <h1>Sign Up</h1> <form action="{{ url_for('signup') }}" method="POST"> <input type="email" name="email" placeholder="Enter your email" required> <input type="password" name="password" placeholder="Enter your password" required> <input type="hidden" name="bot_check"> <input type="submit" value="Sign Up"> </form> {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} <ul> {% for category, message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %} {% endwith %} </body> </html>
デバッグを有効にして flask コマンドを実行すると、この時点からコードが機能するはずです。これにより、ブラウザ ウィンドウだけでなくコマンド ラインでもエラーを確認できるようになります:
flask --app app.py --debug run
以上がPython を使用してスパム対策のオプトイン電子メール登録を構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。