Az érvényes e-mail-cím egy átjáró a közvetlen kommunikációhoz, potenciális ügyfelek generálásához, értékesítéshez, online közösségekbe való privát meghíváshoz stb. Ne vegye magától értetődőnek, mert a közösségi média változik. A technológia fejlődésének köszönhetően az e-mail továbbra is a bevált módja a kapcsolatteremtésnek. A dolgok egyszerűek maradnak, és nem a semmiből kódolunk, mert a Python már meglévő modulokkal segíti a kódolás felgyorsítását.
Voltak olyan ügyeim, akik megkérték, hogy készítsek e-mailes regisztrációs űrlapokat termékeik reklámozására, de egyik vásárló sem akart havi díjat fizetni egy harmadik féltől származó, készen kapható szolgáltatásért, így pénzt takarítottam meg azzal, hogy személyre szabott kapcsolatfelvételi űrlapokat készítettem. amit örökké használhatnak. Segíthetek Önnek ebben, akár induló vállalkozása, ügyfele, marketing céljaira, vagy ami a legjobb, a spamek visszaszorítása érdekében.
Ez azoknak szól, akik szeretnének megtanulni kódolni Pythonban, és különösen hasznos azoknak a kezdőknek, akik esetleg nem veszik figyelembe a biztonsági funkciókat, például a felhasználói bevitel szűrését, az e-mail címek ellenőrzését és az e-mailek kettős engedélyezését. Ebben az oktatóanyagban az 1–3. lépést ismertetjük:
Nem kell harmadik fél szolgáltatásaira hagyatkoznunk, mint például az Auth0, a Facebook vagy a Google, hogy hozzáférhessünk az alkalmazásához és a szolgáltatásaihoz, amelyek bármikor leállíthatják Önt, vagy megoszthatják adatait. Tartsa meg az alkalmazás adatait!
Kezdetben némi tapasztalattal kell rendelkeznie a Pythonban, mert a Flask keretrendszert fogjuk használni MySQL adatbázissal . Ez sokkal szórakoztatóbb lesz (talán), mint a WordPress, a legnépszerűbb CMS használata. Fizetnie kell néhány WordPress beépülő modulért, hogy ugyanolyan képességekkel rendelkezzen, mint egy ingyenes Flask bővítmény. Korábban a Wordpressre (PHP) építettem, és a Python Flask-ot részesítem előnyben webes alkalmazásokhoz, bár a Wordpress nagyon képes webalkalmazások készítésére.
Meglévő Python modulokat fogunk használni, amelyek leegyszerűsítik a felhasználói bevitel tisztítását, az ellenőrző hivatkozás létrehozását és az adatbázissal való kommunikációt.
Minden kódrészletet elmagyarázunk, és néhány megjegyzést tartalmaz a kódban. Ha még nem építetted ki a felhasználói regisztrációt, vagy ismered a belső működést, akkor leírom a részleteket, majd a végén láthatod a végső kódot (ne ugorj előre).
Az alábbiakban összefoglaljuk azokat a funkciókat, amelyeket az első bekezdésben leírtak szerint fogunk megvalósítani:
Az érvényes e-mail-címet úgy ellenőrizheti, hogy a felhasználótól származó bemeneti karakterláncot reguláris kifejezéssel vagy Flask kiterjesztéssel elemzi. Nem engedélyezzük a véletlenszerű szöveges vagy SQL-befecskendezési típusú feltöréseket.
A kettős jelentkezési módszer megköveteli, hogy a címzett engedélyt adjon Önnek e-mail küldésére úgy, hogy megkapja a beérkezett üzenetek mappájába mutató hitelesítő linket. Ez elsősorban arra szolgál, hogy megakadályozza, hogy valaki más használja az Ön e-mail címét. Ez azt is megakadályozza, hogy a tesztfelhasználók csak regisztráljanak, és elhagyják fiókjukat.
A botmegelőzés megvalósítható egy rejtett mezővel, amely nem jelenik meg a felhasználó számára, de általában automatikusan kitöltik a sebezhető regisztrációs űrlapokat kereső robotok, de ez nem olyan megbízható, mint egy harmadik féltől származó „captcha”.
Kezdjük a kódolással. Hozzon létre egy munkakönyvtárat:
mkdir signup cd signup
Hozza létre Python-környezetét python3 -m venv signup
vagy conda create -n double-opt-contact python3
használatával. Én jobban szeretem a condát, és ha többet szeretne megtudni, olvassa el a Python környezetekről szóló cikkemet.
Telepítse a következő függőségeket:
pip flask flask-mail secure SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python bleach
Alternatív megoldásként használhatja ugyanazokat a függőségeket, amelyek szerepelnek a requirements.txt
fájlban, és futtassa pip install -r requirements.txt
Hozzon létre app.py
fájlt a következő függőségekkel:
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 import secrets import bleach
Inicializálja az alkalmazásobjektumot az alapértelmezett sablonmappa helyével:
app = Flask(__name__, template_folder='templates')
Adja meg saját szerver konfigurációs adatait az alábbi sorok segítségével:
secret = secrets.token_urlsafe(32) app.secret_key = secret app.config['SECRET_KEY'] = secret # auto-generated secret key # SQLAlchemy configurations app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector://admin:user@localhost/tablename' # Email configurations app.config['MAIL_SERVER'] = 'smtp.example.com' app.config['MAIL_PORT'] = 465 #check your port 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) sserialzer = URLSafeTimedSerializer(app.config['SECRET_KEY']) #set secret to the serliazer
Végső soron a konfigurációs adatoknak egy .env
fájlban kell lenniük.
Szükségünk lesz egy MySQL adatbázisra a felhasználók tárolására, amely manuálisan vagy Python kóddal hozható létre. A tanulási folyamat részeként beírhatja a következő kódot a parancssorból vagy a Python with app.app_context() db_create_all()
metódussal.
Az érvényesített mező egy token karakterláncra vonatkozik, amely lehetővé teszi a dupla opt-in technikát.
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(120) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, validated BOOLEAN DEFAULT FALSE );
A következő szakasz az SQLAlchemy ORM-struktúráját használja az adatbázis lekérdezéséhez. Vegye figyelembe, hogy az osztály nevének meg kell egyeznie az adatbázistábla nevével, ellenkező esetben hibaüzenetet kap. A db.model
a táblázat beállításait képviseli, amelyek magukban foglalják az oszlop nevét, típusát, hosszát, kulcsát és nullértékét:
class User(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True, nullable=False) created_at = db.Column(db.DateTime, server_default=db.func.now()) validated = db.Column(db.Boolean, default=False)
Ha még nem hozta létre manuálisan a MySQL adatbázistáblát, akkor ezt a Flask kóddal közvetlenül az class User
code blokkja után megteheti:
# Create the database table with app.app_context(): db.create_all()
Most beírjuk a háttérkódot, amely 2 oldal/útvonal (index, regisztráció), az e-mail üzenetet és a megerősítést. A regisztrációs oldal tartalmazza a GET/POST
metódusokat, amelyek lehetővé teszik az űrlap elküldését. A bleach
objektum egy Python-bővítmény, amely megtisztítja a bemenetet a felhasználótól a biztonság és a rosszindulatú szkriptek visszaszorítása érdekében. Ezután a sserializer
létrehoz egy egyszeri tokent, amely e-mailben elküldi az ellenőrző linket.
@app.route('/') def index(): return '<h1>Index page</h1>' @app.route('/signup', methods=['GET', 'POST']) def signup(): if request.method == 'POST': email = bleach.clean(request.form.get('email')) # Insert user into the database new_user = User(email=email) try: db.session.add(new_user) db.session.commit() except Exception as e: print(f"Error occurred saving to db: {e}") # Send confirmation email token = sserialzer.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}' try: mail.send(msg) except Exception as e: print(f"Error occurred sending message: {e}") flash("Error occurred sending message!") return render_template('signup.html') flash('A confirmation email has been sent to your email address.', 'success') return redirect(url_for('index')) return render_template('signup.html')
A HTML-regisztrációs űrlap hozzáadása előtt fejezzük be a háttérrendszert a kettős feliratkozási funkció érvényesítési útvonalának hozzáadásával. Ez az útvonal a korábban létrehozott s
változót használja, amely az időérzékeny titkos tokent generálja. Lásd
A maximális életkor a link lejárta előtti másodperc, így ebben az esetben a felhasználónak 20 perce van az e-mail cím megerősítésére.
@app.route('/confirm_email/<token>') def confirm_email(token): try: email = sserialzer.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>'
Most, a mindenütt jelenlévő fő utasításhoz, amely azt utasítja a Pythonnak, hogy futtassa le a szkriptet, ha a fájl közvetlenül fut (szemben az importált modullal):
if __name__ == '__main__': app.run()
Mielőtt befejeznénk ezt a háttérkódot, szükségünk van a felhasználói bevitelhez az előtér HTML-kódjára. Ezt a Flask beépített Jinja sablonjával fogjuk megtenni. Hozzon létre egy templates/signup.html
nevű fájlt, amelynek nevének meg kell egyeznie az app.py
fájlban korábban létrehozott útvonallal. Alapértelmezés szerint a Jinja a /templates
könyvtárat használja a html fájlokhoz. Ezt a beállítást módosíthatja, de ehhez az oktatóanyaghoz az alkalmazás /templates
könyvtárát fogjuk használni.
<!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="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>
A kódnak ettől a ponttól kezdve működnie kell, amikor a flask parancsot engedélyezve a hibakereséssel futtatja. Ez lehetővé teszi a parancssorban és a böngészőablakban megjelenő hibákat:
flask --app app.py --debug run
Nyissa meg böngészőjét a parancssorban látható tartományra (localhost), és az indexoldalnak meg kell jelennie. Próbálja meg érvényes e-mail címmel elküldeni az űrlapot, hogy megkapja az ellenőrző linket. Miután megkapta a linket, a következőképpen kell kinéznie: http://localhost:5000/confirm_email/InRvbUByYXRldG91cmd1aWRlcy5jb20i.ZteEvQ.7o1_L0uM9Wl8uii7KhJdiWAH
, az itt látható érvényesítési útvonal segítségével követheti azt, és megkaphatja az érvényesítő útvonalat.
@app.route('/confirm_email/<token>') def confirm_email(token): try: email = sserializer.loads(token, salt='email-confirm', max_age=1200) # Token expires after 1 hour except SignatureExpired: return '<h1>Oops, the token expired!</h1>' # Update field in database user = Users.query.filter_by(email=email).first_or_404() user.validated = True try: db.session.commit() except Exception as e: print(f"Error occurred saving to db: {e}") return '<h1>Email address confirmed!</h1>'
Ez az útvonal elfogadja a korábban Önnek küldött token karakterláncot, és ellenőrzi, hogy egyezik-e a megfelelő adatbázis-bejegyzéssel. Ha ez megtörténik, az validated
mezőt True
értékre frissíti, és nyugodtan tudhatja, hogy a regisztrációs űrlapot nem hagyták el.
Ez egy fontos lépés, amelyet minden sikeres vállalkozás használ a regisztrációs rendszerében, és most Ön is megvan. De várjunk csak, mi van akkor, ha bottámadásokat kapunk, amelyek véletlenszerű e-mail címeket küldenek el anélkül, hogy ellenőriznénk őket? Akkor lesz egy piszkos adatbázis tele haszontalan bejegyzésekkel. Ezt akadályozzuk meg!
A bottámadások megelőzésére vagy legalább a fejlettek mérséklésére saját időigényes megoldást készíthet, beleértve egy olyan IP-korlátozót, amely memórián belüli adatbázist igényel, mint például a Redis, vagy használhat harmadik féltől származó szolgáltatást, például a Google captcha-ját, ill. hCaptcha.
Az oktatóanyagunkban hozzáadjuk
Új követelményekre van szükségünk, ezért telepítse őket:
pip install flask-hcaptcha requests
Kérésre van szükség az e-mail cím elküldéséhez a hcaptcha-hoz érvényesítés céljából. Szerezze meg a kulcsot, és integrálja a hcaptcha javascript fájlját a HTML regisztrációs űrlapjával. Adja hozzá a fájlt a HTML-oldal fejlécéhez és a webhely kulcsát az űrlaphoz:
<head> ... <script src="https://hcaptcha.com/1/api.js" async defer></script> </head> <body> ... <form action="{{ url_for('signup') }}" method="POST"> <input type="email" name="email" placeholder="Enter your email" required> <input type="submit" value="Sign Up"> <div class="h-captcha" data-sitekey="b62gbcc-5cg2-41b2-cd5a-de95dd1eg61h" data-size="compact"></div> </form>
A kódban szereplő webhelykulcs egy példa; szüksége lesz a sajátjára az ingyenes csomagból. Ez a webhelykulcs érvényesíti az űrlapot, és a hcaptcha által ismert spamrobotok átfogó listájával ellenőrzi a webhely látogatóját.
Ezután módosítsa az app.py
fájlt úgy, hogy tartalmazza a hcaptcha titkos kulcsát (nem a webhelykulcsot) az app.config objektumban, és tegye fel a választ a hcaptcha-ra, mielőtt elmentené a saját adatbázisába.
app.config['HCAPTCHA_SECRET_KEY'] = 'your-secret-hcaptcha-key' ... @app.route("/signup", methods=['GET', 'POST']) def signup(): if request.method == 'POST': email = bleach.clean(request.form.get('email')) hcaptcha_response = request.form.get('h-captcha-response') # Verify hCaptcha response payload = { 'secret': app.config['HCAPTCHA_SECRET_KEY'], 'response': hcaptcha_response } try: response = requests.post('https://hcaptcha.com/siteverify', data=payload, timeout=10) result = response.json() except requests.exceptions.RequestException as e: print(f"Request failed: {e}") if not result.get('success'): flash('CAPTCHA validation failed, please try again.', 'danger') ... # Insert user into the database new_user = Users(email=email)
Ha ez megtörtént, a regisztrációs űrlapon megjelenik a hcaptcha ikon, és a spamek elkerülése érdekében engedélyezni kell. Most már egy robusztusabb formája van új alkalmazásának.
Ha bármilyen hibát észlel, vagy elírási hibát észlel a kódban, ellenőrizheti a kitöltött kódot
Írd meg kommentben, ha többet szeretnél.