This guide explains how to integrate django-phone-verify
into your user signup process.
It includes two approaches:
- Using Django REST Framework (DRF)
- Using standard Django views and forms (non-DRF)
This method is ideal if your project uses APIs for registration.
- Create a custom ViewSet
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from phone_verify.api import VerificationViewSet
from phone_verify import serializers as phone_serializers
from . import services, serializers
class YourCustomViewSet(VerificationViewSet):
@action(
detail=False,
methods=['POST'],
permission_classes=[AllowAny],
serializer_class=serializers.YourCustomSerializer,
)
def verify_and_register(self, request):
phone_serializer = phone_serializers.SMSVerificationSerializer(data=request.data)
phone_serializer.is_valid(raise_exception=True)
user_serializer = serializers.YourUserSerializer(data=request.data)
user_serializer.is_valid(raise_exception=True)
user = services.create_user_account(**user_serializer.validated_data)
return Response(user_serializer.data)
- Create serializers
from rest_framework import serializers
from phone_verify.serializers import SMSVerificationSerializer
class YourUserSerializer(serializers.Serializer):
username = serializers.CharField()
email = serializers.EmailField()
password = serializers.CharField()
class YourCustomSerializer(YourUserSerializer, SMSVerificationSerializer):
pass
- Create service for user creation
from django.contrib.auth import get_user_model
def create_user_account(username, email, password, **extra):
return get_user_model().objects.create_user(
username=username,
email=email,
password=password,
**extra,
)
- Register viewset in urls.py
from rest_framework.routers import DefaultRouter
from yourapp.api import YourCustomViewSet
router = DefaultRouter(trailing_slash=False)
router.register('phone', YourCustomViewSet, basename='phone')
urlpatterns = router.urls
If you're using Django templates and standard views, you can integrate phone verification manually using the core service API.
This process happens in two steps:
- First, the user submits their phone number to request a verification code.
- Then, on a second form, they enter the code they received to verify their number and proceed with registration.
- Forms
from django import forms
class PhoneRequestForm(forms.Form):
phone_number = forms.CharField()
class VerificationForm(forms.Form):
phone_number = forms.CharField(widget=forms.HiddenInput)
security_code = forms.CharField()
username = forms.CharField()
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput)
- Views
from django.shortcuts import render, redirect
from phone_verify.services import PhoneVerificationService
from django.contrib.auth import get_user_model
from .forms import PhoneRequestForm, VerificationForm
def request_code_view(request):
if request.method == 'POST':
form = PhoneRequestForm(request.POST)
if form.is_valid():
phone = form.cleaned_data['phone_number']
verifier = PhoneVerificationService(phone)
verifier.send_verification()
return redirect(f'/verify/?phone_number={phone}')
else:
form = PhoneRequestForm()
return render(request, 'request_code.html', {'form': form})
def verify_and_register_view(request):
if request.method == 'POST':
form = VerificationForm(request.POST)
if form.is_valid():
phone = form.cleaned_data['phone_number']
code = form.cleaned_data['security_code']
verifier = PhoneVerificationService(phone)
if verifier.verify(code):
get_user_model().objects.create_user(
username=form.cleaned_data['username'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password'],
)
return redirect('login')
else:
phone = request.GET.get('phone_number', '')
form = VerificationForm(initial={'phone_number': phone})
return render(request, 'verify_and_register.html', {'form': form})
- Templates
request_code.html
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Send Verification Code</button>
</form>
verify_and_register.html
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Verify & Register</button>
</form>
Choose the approach that best fits your architecture. For APIs, use DRF. For standard form submissions, follow the manual integration path.
For sandbox or custom backend support, see the :doc:`customization` guide.