← Назад к вопросам
Как запретить обслуживание пользователей с емейлами в домена yahoo.com?
1.0 Junior🔥 81 комментариев
#Python Core#Безопасность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Способы запретить обслуживание пользователей с yahoo.com
Это типичная задача при разработке сервиса — блокировка определённых доменов почты. Рассмотрим несколько подходов от простейшего к продвинутому.
1. Валидация при регистрации
Самый простой способ — проверка при создании пользователя:
from typing import Optional
BLOCKED_DOMAINS = {"yahoo.com", "yahoo.ru", "ymail.com"}
def validate_email(email: str) -> bool:
"""Проверяет, разрешен ли домен email"""
if "@" not in email:
return False
domain = email.split("@")[1].lower()
return domain not in BLOCKED_DOMAINS
# Использование
if not validate_email(user_email):
raise ValueError("Email с домена yahoo.com не допускается")
2. Декоратор для функций
Если нужно защитить несколько функций, используй декоратор:
from functools import wraps
def require_allowed_email(func):
"""Декоратор: проверяет email пользователя перед выполнением"""
@wraps(func)
def wrapper(user_email: str, *args, **kwargs):
if not validate_email(user_email):
raise PermissionError(f"Email {user_email} заблокирован")
return func(user_email, *args, **kwargs)
return wrapper
@require_allowed_email
def process_user_data(user_email: str):
print(f"Обработка {user_email}")
3. Middleware для веб-приложения
Для FastAPI добавь middleware на уровне приложения:
from fastapi import FastAPI, Request, status
from fastapi.responses import JSONResponse
app = FastAPI()
@app.middleware("http")
async def email_filter_middleware(request: Request, call_next):
if request.method == "POST":
try:
body = await request.body()
import json
data = json.loads(body)
email = data.get("email", "")
if email and not validate_email(email):
return JSONResponse(
status_code=status.HTTP_403_FORBIDDEN,
content={"detail": "Email домена yahoo.com запрещён"}
)
except:
pass
response = await call_next(request)
return response
Рекомендация для production
Комбинируй подходы: клиентская валидация для UX, валидация API при регистрации, триггер БД как последняя линия защиты.