백엔드 개발 파이썬 튜토리얼 Python을 사용하여 스팸 방지, 옵트인 이메일 등록 구축

Python을 사용하여 스팸 방지, 옵트인 이메일 등록 구축

Aug 14, 2024 pm 02:35 PM

Build an anti-spam, opt-in Email registration with Python

그럼 앱을 만들고 많은 사용자를 확보하고 싶으신가요?

우리 모두는 그렇습니다. 초보자라면 다음 이메일 가입 기능을 고려해야 합니다.

  1. 강력한 비밀번호를 갖춘 유효한 이메일 주소
  2. 봇 예방
  3. 이중 선택 가입

웹 앱, 뉴스레터, 무료 다운로드, 비공개 그룹 초대 및 리드 생성을 위해서는 견고한 이메일 가입 시스템이 필수적입니다. 앱에 액세스하기 위해 Auth0, Facebook 또는 Google과 같은 타사 서비스를 사용하지 마십시오. 앱 데이터를 그대로 유지하세요!

시작하려면 MySQL 데이터베이스와 함께 Flask 프레임워크를 사용할 것이므로 Python에 대한 경험이 있어야 합니다. 이것은 가장 인기 있는 CMS인 Wordpress를 사용하는 것보다 더 재미있을 것입니다. 무료 Flask 확장과 동일한 기능을 사용하려면 일부 Wordpress 플러그인에 대한 비용을 지불해야 합니다. 저는 이전에 두 가지 모두를 기반으로 구축했으며 Wordpress가 웹 앱을 만드는 데 매우 능숙함에도 불구하고 웹 앱용 Python Flask를 선호합니다.

각 코드 조각에 대해 설명하고 코드에 몇 가지 설명을 포함합니다. 사용자 등록을 구축하지 않았거나 내부 작동 방식을 알지 못하는 경우 자세한 내용을 설명하겠습니다. 첫 번째 단락에 명시된 대로 구현할 기능을 요약하면 다음과 같습니다.

  1. 유효한 이메일 주소는 정규식이나 Flask 확장을 사용하여 사용자가 입력한 문자열을 구문 분석하여 확인할 수 있습니다. 임의의 텍스트나 SQL 주입 유형의 해킹은 허용되지 않습니다.

  2. 봇 방지는 사용자에게 표시되지 않지만 일반적으로 취약한 가입 양식을 크롤링하는 봇에 의해 자동으로 채워지는 숨겨진 필드를 사용하여 수행할 수 있습니다.

  3. 이중 수신 동의 방법을 사용하려면 수신자가 받은편지함에 대한 확인 링크를 받아 이메일을 보낼 수 있도록 허용해야 합니다. 이는 주로 다른 사람이 귀하의 이메일 주소를 사용하는 것을 방지하는 데 사용됩니다. 이는 또한 방금 가입하고 계정을 탈퇴하는 테스트 사용자를 방지합니다.

코딩해보자!

작업 디렉토리 만들기:

mkdir signup
cd signup
로그인 후 복사

python3 -m venv signup 또는 conda create -n signup 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 플라스크 플라스크-메일 보안 SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python

또는 요구 사항.txt 파일에 동일한 내용을 나열하고 pip install -r 요구 사항.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'] = '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에 스크립트를 실행하도록 지시하는 유비쿼터스 기본 명령문에 대해 설명합니다.

if __name__ == '__main__':
    app.run(debug=True)
로그인 후 복사

이 백엔드 코드를 완성하기 전에 사용자 입력을 위한 프런트엔드 HTML이 여전히 필요합니다. 우리는 Flask에 내장된 Jinja 템플릿을 사용하여 이 작업을 수행할 것입니다. 이전에 app.py에서 만든 경로와 이름이 일치하는 template/signup.html이라는 파일을 만듭니다. 기본적으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Apr 01, 2025 pm 05:09 PM

Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? 한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? Apr 01, 2025 pm 11:15 PM

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? 10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? Apr 02, 2025 am 07:18 AM

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? 중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? Apr 02, 2025 am 07:15 AM

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

정규 표현이란 무엇입니까? 정규 표현이란 무엇입니까? Mar 20, 2025 pm 06:25 PM

정규 표현식은 프로그래밍의 패턴 일치 및 텍스트 조작을위한 강력한 도구이며 다양한 응용 프로그램에서 텍스트 처리의 효율성을 높입니다.

인기있는 파이썬 라이브러리와 그 용도는 무엇입니까? 인기있는 파이썬 라이브러리와 그 용도는 무엇입니까? Mar 21, 2025 pm 06:46 PM

이 기사는 Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask 및 요청과 같은 인기있는 Python 라이브러리에 대해 설명하고 과학 컴퓨팅, 데이터 분석, 시각화, 기계 학습, 웹 개발 및 H에서의 사용에 대해 자세히 설명합니다.

Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Apr 01, 2025 pm 10:51 PM

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

문자열을 통해 객체를 동적으로 생성하고 방법을 파이썬으로 호출하는 방법은 무엇입니까? 문자열을 통해 객체를 동적으로 생성하고 방법을 파이썬으로 호출하는 방법은 무엇입니까? Apr 01, 2025 pm 11:18 PM

파이썬에서 문자열을 통해 객체를 동적으로 생성하고 메소드를 호출하는 방법은 무엇입니까? 특히 구성 또는 실행 해야하는 경우 일반적인 프로그래밍 요구 사항입니다.

See all articles