suchen
HeimBackend-EntwicklungPython-TutorialImplementierung der Telefonnummernüberprüfung in einem DRF-Projekt

Implémentation de vérification de numéro de téléphone dans un projet drf

Um ein Telefonnummernüberprüfungssystem mit Django REST Framework (DRF) zu implementieren, können Sie die folgenden Schritte ausführen. Dieses System ermöglicht es Benutzern, ihre Telefonnummer anzugeben, einen Bestätigungscode per SMS zu erhalten (z. B. über Twilio) und diesen Code zu validieren, um ihre Nummer zu bestätigen.

Hauptschritte:

  1. Notwendige Abhängigkeiten installieren
  2. Benutzervorlage bearbeiten, um Telefonnummer einzuschließen
  3. Erstellen Sie eine Vorlage zum Speichern von Bestätigungscodes
  4. Konfigurieren Sie einen SMS-Versanddienst (z. B. Twilio)
  5. DRF-Serialisierer erstellen
  6. Ansichten und API-Routen erstellen
  7. Verifizierungslogik und Sicherheit verwalten

1. Installieren Sie die erforderlichen Abhängigkeiten

Stellen Sie zunächst sicher, dass Sie die erforderlichen Bibliotheken installiert haben:

  • Django REST Framework: Falls Sie es noch nicht getan haben.
  • Twilio: Zum Senden von SMS.
  • django-phonenumber-field: Zur Validierung und Formatierung von Telefonnummern.

Installieren Sie sie über pip:

pip install djangorestframework twilio django-phonenumber-field

Fügen Sie phonenumber_field und rest_framework zu Ihren INSTALLED_APPS in Settings.py hinzu:

# settings.py

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'phonenumber_field',
    # ...
]

2. Ändern Sie die Benutzervorlage so, dass sie die Telefonnummer einschließt

Wenn Sie eine benutzerdefinierte Benutzervorlage verwenden, fügen Sie ein Feld für die Telefonnummer und ein Verifizierungskennzeichen hinzu.

# models.py

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
from phonenumber_field.modelfields import PhoneNumberField

class UserManager(BaseUserManager):
    def create_user(self, email, username, phone_number, password=None):
        if not email:
            raise ValueError('Les utilisateurs doivent avoir une adresse email')
        if not phone_number:
            raise ValueError('Les utilisateurs doivent avoir un numéro de téléphone')

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            phone_number=phone_number,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, phone_number, password=None):
        user = self.create_user(
            email,
            username,
            phone_number,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

class CustomUser(AbstractBaseUser):
    email = models.EmailField(verbose_name='adresse email', max_length=255, unique=True)
    username = models.CharField(max_length=50, unique=True)
    phone_number = PhoneNumberField(unique=True, null=False, blank=False)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_phone_verified = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'phone_number']

    def __str__(self):
        return self.email

    @property
    def is_staff(self):
        return self.is_admin

Hinweis: Wenn Sie bereits über ein Benutzermodell verfügen, stellen Sie sicher, dass Sie die Felder „phone_number“ und „is_phone_verified“ entsprechend hinzufügen.

3. Erstellen Sie eine Vorlage zum Speichern von Bestätigungscodes

In dieser Vorlage werden an Benutzer gesendete Bestätigungscodes gespeichert.

# models.py

import random
import string
from django.utils import timezone
from datetime import timedelta

class PhoneVerification(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='phone_verifications')
    code = models.CharField(max_length=6)
    created_at = models.DateTimeField(auto_now_add=True)
    is_verified = models.BooleanField(default=False)

    def is_expired(self):
        return self.created_at 



<h3>
  
  
  4. Konfigurieren Sie einen SMS-Versanddienst (z. B. Twilio).
</h3>

<p>Sie können Twilio zum Senden von Textnachrichten verwenden. Erstellen Sie zunächst ein Twilio-Konto und besorgen Sie sich die erforderlichen Anmeldeinformationen (ACCOUNT_SID, AUTH_TOKEN, FROM_NUMBER).</p>

<p>Fügen Sie diese Konfigurationen zu Ihrer Settings.py hinzu:<br>
</p>

<pre class="brush:php;toolbar:false"># settings.py

TWILIO_ACCOUNT_SID = 'votre_account_sid'
TWILIO_AUTH_TOKEN = 'votre_auth_token'
TWILIO_FROM_NUMBER = '+1234567890'  # Numéro Twilio

Erstellen Sie eine utils.py-Datei, um den SMS-Versand zu verwalten:

# utils.py

from django.conf import settings
from twilio.rest import Client

def send_sms(to, message):
    client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
    message = client.messages.create(
        body=message,
        from_=settings.TWILIO_FROM_NUMBER,
        to=str(to)
    )
    return message.sid

5. Erstellen Sie DRF-Serialisierer

Erstellen Sie Serialisierer, um die Verifizierungsanfrage und Codevalidierung zu verarbeiten.

pip install djangorestframework twilio django-phonenumber-field

6. Erstellen Sie API-Ansichten und Routen

Erstellen Sie Ansichten, um Verifizierungsanfragen und Codevalidierung zu verwalten.

# settings.py

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'phonenumber_field',
    # ...
]

Hinweis: Möglicherweise möchten Sie diese Ansichten nach Bedarf anpassen, beispielsweise wenn Sie während der Überprüfung einen Benutzer erstellen oder vorhandene Benutzer anders verwalten möchten.

7. Konfigurieren Sie API-Routen

Fügen Sie die entsprechenden Routen in Ihre urls.py ein.

# models.py

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
from phonenumber_field.modelfields import PhoneNumberField

class UserManager(BaseUserManager):
    def create_user(self, email, username, phone_number, password=None):
        if not email:
            raise ValueError('Les utilisateurs doivent avoir une adresse email')
        if not phone_number:
            raise ValueError('Les utilisateurs doivent avoir un numéro de téléphone')

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            phone_number=phone_number,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, phone_number, password=None):
        user = self.create_user(
            email,
            username,
            phone_number,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

class CustomUser(AbstractBaseUser):
    email = models.EmailField(verbose_name='adresse email', max_length=255, unique=True)
    username = models.CharField(max_length=50, unique=True)
    phone_number = PhoneNumberField(unique=True, null=False, blank=False)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_phone_verified = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'phone_number']

    def __str__(self):
        return self.email

    @property
    def is_staff(self):
        return self.is_admin

8. Zusätzliche Logiken hinzufügen (optional)

hat. Generierung von eindeutigem Code pro Benutzer

Bearbeiten Sie die Anforderungsansicht, um den Code einem bestimmten Benutzer zuzuordnen oder einen neuen Benutzer zu erstellen.

B. Begrenzen Sie die Anzahl der Anfragen

Um Missbrauch zu vermeiden, begrenzen Sie die Anzahl der Verifizierungsanfragen pro Benutzer oder Telefonnummer.

# models.py

import random
import string
from django.utils import timezone
from datetime import timedelta

class PhoneVerification(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='phone_verifications')
    code = models.CharField(max_length=6)
    created_at = models.DateTimeField(auto_now_add=True)
    is_verified = models.BooleanField(default=False)

    def is_expired(self):
        return self.created_at 



<h4>
  
  
  C. Benutzerverwaltung während der Verifizierung
</h4>

<p>Sie können nach der Überprüfung entscheiden, einen Benutzer zu erstellen oder die Nummer einem vorhandenen Benutzer zuzuordnen.</p>

<h3>
  
  
  9. Tests und Validierung
</h3>

<p>Testen Sie Ihr System unbedingt in einer Entwicklungsumgebung, bevor Sie es in der Produktion bereitstellen. Überprüfen Sie Folgendes:</p>

  • SMS-Nachrichten werden korrekt gesendet.
  • Codes werden sicher generiert und gespeichert.
  • Schecks verfallen nach der eingestellten Zeit.
  • Fehler werden korrekt behandelt und dem Benutzer mitgeteilt.

Vollständiges Implementierungsbeispiel

Um Ihnen einen Überblick zu geben, finden Sie hier ein vollständiges Beispiel der betroffenen Dateien.

models.py

# settings.py

TWILIO_ACCOUNT_SID = 'votre_account_sid'
TWILIO_AUTH_TOKEN = 'votre_auth_token'
TWILIO_FROM_NUMBER = '+1234567890'  # Numéro Twilio

serializers.py

# utils.py

from django.conf import settings
from twilio.rest import Client

def send_sms(to, message):
    client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
    message = client.messages.create(
        body=message,
        from_=settings.TWILIO_FROM_NUMBER,
        to=str(to)
    )
    return message.sid

Ansichten.py

# serializers.py

from rest_framework import serializers
from .models import CustomUser, PhoneVerification
from phonenumber_field.serializerfields import PhoneNumberField

class PhoneVerificationRequestSerializer(serializers.Serializer):
    phone_number = PhoneNumberField()

    def validate_phone_number(self, value):
        if CustomUser.objects.filter(phone_number=value).exists():
            raise serializers.ValidationError("Ce numéro de téléphone est déjà utilisé.")
        return value

class PhoneVerificationCodeSerializer(serializers.Serializer):
    phone_number = PhoneNumberField()
    code = serializers.CharField(max_length=6)

    def validate(self, data):
        phone_number = data.get('phone_number')
        code = data.get('code')

        try:
            user = CustomUser.objects.get(phone_number=phone_number)
        except CustomUser.DoesNotExist:
            raise serializers.ValidationError("Utilisateur non trouvé avec ce numéro de téléphone.")

        try:
            verification = PhoneVerification.objects.filter(user=user, code=code, is_verified=False).latest('created_at')
        except PhoneVerification.DoesNotExist:
            raise serializers.ValidationError("Code de vérification invalide.")

        if verification.is_expired():
            raise serializers.ValidationError("Le code de vérification a expiré.")

        data['user'] = user
        data['verification'] = verification
        return data

urls.py

# views.py

from rest_framework import generics, status
from rest_framework.response import Response
from .serializers import PhoneVerificationRequestSerializer, PhoneVerificationCodeSerializer
from .models import CustomUser, PhoneVerification
from .utils import send_sms
import random
import string
from django.utils import timezone
from rest_framework.permissions import AllowAny

class PhoneVerificationRequestView(generics.GenericAPIView):
    serializer_class = PhoneVerificationRequestSerializer
    permission_classes = [AllowAny]

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        phone_number = serializer.validated_data['phone_number']

        # Générer un code de 6 chiffres
        code = ''.join(random.choices(string.digits, k=6))

        try:
            user = CustomUser.objects.get(phone_number=phone_number)
            # Si l'utilisateur existe déjà, ne pas permettre la création d'un nouveau
            return Response({"detail": "Ce numéro de téléphone est déjà associé à un utilisateur."}, status=status.HTTP_400_BAD_REQUEST)
        except CustomUser.DoesNotExist:
            pass  # Permettre la création si nécessaire

        # Créer une instance de PhoneVerification
        verification = PhoneVerification.objects.create(user=None, code=code)  # user=None pour l'instant

        # Envoyer le code par SMS
        try:
            send_sms(phone_number, f"Votre code de vérification est : {code}")
        except Exception as e:
            return Response({"detail": "Erreur lors de l'envoi du SMS."}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        return Response({"detail": "Code de vérification envoyé."}, status=status.HTTP_200_OK)

class PhoneVerificationCodeView(generics.GenericAPIView):
    serializer_class = PhoneVerificationCodeSerializer
    permission_classes = [AllowAny]

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        verification = serializer.validated_data['verification']

        # Marquer la vérification comme validée
        verification.is_verified = True
        verification.save()

        # Mettre à jour l'utilisateur
        user.is_phone_verified = True
        user.save()

        return Response({"detail": "Numéro de téléphone vérifié avec succès."}, status=status.HTTP_200_OK)

utils.py

# urls.py

from django.urls import path
from .views import PhoneVerificationRequestView, PhoneVerificationCodeView

urlpatterns = [
    path('api/verify-phone/request/', PhoneVerificationRequestView.as_view(), name='phone-verification-request'),
    path('api/verify-phone/verify/', PhoneVerificationCodeView.as_view(), name='phone-verification-verify'),
]

10. Sichern und optimieren

  • Überprüfungsversuche begrenzen: Implementieren Sie ein System, um die Anzahl der Überprüfungsversuche zu begrenzen, um Brute-Force-Angriffe zu vermeiden.

  • Codes verschlüsseln: Für zusätzliche Sicherheit können Sie die Bestätigungscodes in der Datenbank verschlüsseln.

  • Asynchrone Aufgaben verwenden: Um die Leistung zu verbessern, verwenden Sie asynchrone Aufgaben (z. B. mit Celery), um SMS zu senden, ohne API-Anfragen zu blockieren.

  • HTTPS konfigurieren: Stellen Sie sicher, dass Ihre API über HTTPS zugänglich ist, um die Kommunikation zu sichern.

Das obige ist der detaillierte Inhalt vonImplementierung der Telefonnummernüberprüfung in einem DRF-Projekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Was sind einige häufige Gründe, warum ein Python -Skript möglicherweise nicht auf Unix ausgeführt wird?Was sind einige häufige Gründe, warum ein Python -Skript möglicherweise nicht auf Unix ausgeführt wird?Apr 28, 2025 am 12:18 AM

Die Gründe, warum Python -Skripte auf UNIX -Systemen nicht ausgeführt werden können, sind: 1) unzureichende Berechtigungen unter Verwendung von chmod xyour_script.py zur Erteilung von Ausführungsberechtigungen; 2) Falsche oder fehlende Shebang -Linie, Sie sollten #!/Usr/bin/envpython verwenden; 3) In falsche Einstellungen für die Umgebungsvariablen können Sie os.Environ -Debugging drucken. 4) Mit der falschen Python -Version können Sie die Version in der Shebang -Zeile oder der Befehlszeile angeben. 5) Abhängigkeitsprobleme unter Verwendung der virtuellen Umgebung, um Abhängigkeiten zu isolieren; 6) Syntaxfehler, verwenden Sie Python-Mpy_CompileYour_Script.py, um zu erkennen.

Geben Sie ein Beispiel für ein Szenario an, in dem die Verwendung eines Python -Arrays angemessener wäre als die Verwendung einer Liste.Geben Sie ein Beispiel für ein Szenario an, in dem die Verwendung eines Python -Arrays angemessener wäre als die Verwendung einer Liste.Apr 28, 2025 am 12:15 AM

Die Verwendung von Python -Arrays eignet sich besser für die Verarbeitung großer Mengen von numerischen Daten als für Listen. 1) Arrays speichern mehr Speicher, 2) Arrays sind schneller nach numerischen Werten, 3) Konsistenz vom Arrays Kraftstyp, 4) Arrays sind mit C -Arrays kompatibel, sind jedoch nicht so flexibel und bequem wie Listen.

Was sind die Auswirkungen der Leistung bei der Verwendung von Listen im Vergleich zu Arrays in Python?Was sind die Auswirkungen der Leistung bei der Verwendung von Listen im Vergleich zu Arrays in Python?Apr 28, 2025 am 12:10 AM

Listen besser voreflexibilität undmixdatatatypen, während Datensätze der überlegenen sumerischen Berechnungen sandlastete

Wie handelt es sich bei Numpy um die Speicherverwaltung für große Arrays?Wie handelt es sich bei Numpy um die Speicherverwaltung für große Arrays?Apr 28, 2025 am 12:07 AM

NumpymanageMemoryforlargearrayseffictionlyusingViews, Kopien und Memory-Made.1) ViewsAllowsLicing Mit Outcopying, direktModifizierende Theoriginalarray.2) CopieScanbecreated withthecopy () methodeChoperingdata.3) Memory-Maddscanbeed-medellessive-made-mapedFileshandleshandLessive-massessive-massessiva

Was erfordert das Importieren eines Moduls: Listen oder Arrays?Was erfordert das Importieren eines Moduls: Listen oder Arrays?Apr 28, 2025 am 12:06 AM

ListsinpythondonotRequireMportingamodule, whilearRays aus der FROMTHEARRAYMODULEDONEDANIMIMPORT.1) listet zur Verfügung gestellt.

Welche Datentypen können in einem Python -Array gespeichert werden?Welche Datentypen können in einem Python -Array gespeichert werden?Apr 27, 2025 am 12:11 AM

PythonlistscanstoreanyDatatype, ArrayModulearraysStoreOnetype und NumpyarraysarefornumericalComputations.1) listet dieArversatile-memory-effizient.2) Arraymodulenarraysalememory-effizientforhomogeneData.3) Numpharraysareoptional-EffictionhomogenInData.3) nummodulenarraysoptionalinformanceIntata.3) nummodulearraysoptionalinformanceIntata.3) NumpharraysareoPresopplowancalinScesDataa.3) NumpharraysoePerformance

Was passiert, wenn Sie versuchen, einen Wert des falschen Datentyps in einem Python -Array zu speichern?Was passiert, wenn Sie versuchen, einen Wert des falschen Datentyps in einem Python -Array zu speichern?Apr 27, 2025 am 12:10 AM

Wenn SietostoreavalueOfThewrongdatatypeinapythonarray, touencounteratypeerror.Thissisdustuetothearraymodules -SstrictTypeNeen -Forcortion, welche

Welches ist Teil der Python Standard Library: Listen oder Arrays?Welches ist Teil der Python Standard Library: Listen oder Arrays?Apr 27, 2025 am 12:03 AM

PythonlistsarePartThestandardlibrary, whilearraysarenot.listarebuilt-in, vielseitig und UNDUSEDFORSPORINGECollections, während dieArrayRay-thearrayModulei und loses und loses und losesaluseduetolimitedFunctionality.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor