Creating a simple example to authenticate a React UI with a Python Django backend.
-
Install Django and Django Rest Framework:
pip install django djangorestframework django-cors-headers
-
Create a New Django Project:
django-admin startproject myproject cd myproject
-
Create a New Django App:
python manage.py startapp authapp
-
Configure the Django Project:
-
myproject/settings.py:
INSTALLED_APPS = [ ... 'rest_framework', 'corsheaders', 'authapp', ] MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', ... ] CORS_ALLOWED_ORIGINS = [ 'http://localhost:3000', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), } SIMPLE_JWT = { 'AUTH_HEADER_TYPES': ('Bearer',), }
-
myproject/urls.py:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('authapp.urls')), ]
-
-
Set Up JWT Authentication:
pip install djangorestframework-simplejwt
-
Create API Endpoints:
-
authapp/urls.py:
from django.urls import path from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) from .views import RegisterView urlpatterns = [ path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('register/', RegisterView.as_view(), name='register'), ]
-
authapp/views.py:
from django.contrib.auth.models import User from rest_framework import generics from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework_simplejwt.tokens import RefreshToken from rest_framework import status from .serializers import RegisterSerializer class RegisterView(generics.CreateAPIView): queryset = User.objects.all() permission_classes = (AllowAny,) serializer_class = RegisterSerializer def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.save() refresh = RefreshToken.for_user(user) return Response({ 'refresh': str(refresh), 'access': str(refresh.access_token), }, status=status.HTTP_201_CREATED)
-
authapp/serializers.py:
from django.contrib.auth.models import User from rest_framework import serializers class RegisterSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) class Meta: model = User fields = ('username', 'password', 'email') def create(self, validated_data): user = User.objects.create_user( username=validated_data['username'], email=validated_data['email'], password=validated_data['password'] ) return user
-
-
Migrate the Database:
python manage.py makemigrations python manage.py migrate
-
Create a New React App:
npx create-react-app myfrontend cd myfrontend
-
Install Axios for HTTP Requests:
npm install axios
-
Create Authentication Components:
-
src/App.js:
import React from 'react'; import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; import Register from './components/Register'; import Login from './components/Login'; function App() { return ( <Router> <div className="App"> <Routes> <Route path="/register" element={<Register />} /> <Route path="/login" element={<Login />} /> </Routes> </div> </Router> ); } export default App;
-
src/components/Register.js:
import React, { useState } from 'react'; import axios from 'axios'; function Register() { const [formData, setFormData] = useState({ username: '', email: '', password: '', }); const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value, }); }; const handleSubmit = async (e) => { e.preventDefault(); try { const response = await axios.post('http://localhost:8000/api/register/', formData); console.log('Registration successful:', response.data); } catch (error) { console.error('Registration error:', error); } }; return ( <form onSubmit={handleSubmit}> <input type="text" name="username" placeholder="Username" value={formData.username} onChange={handleChange} /> <input type="email" name="email" placeholder="Email" value={formData.email} onChange={handleChange} /> <input type="password" name="password" placeholder="Password" value={formData.password} onChange={handleChange} /> <button type="submit">Register</button> </form> ); } export default Register;
-
src/components/Login.js:
import React, { useState } from 'react'; import axios from 'axios'; function Login() { const [formData, setFormData] = useState({ username: '', password: '', }); const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value, }); }; const handleSubmit = async (e) => { e.preventDefault(); try { const response = await axios.post('http://localhost:8000/api/token/', formData); localStorage.setItem('access_token', response.data.access); localStorage.setItem('refresh_token', response.data.refresh); console.log('Login successful:', response.data); } catch (error) { console.error('Login error:', error); } }; return ( <form onSubmit={handleSubmit}> <input type="text" name="username" placeholder="Username" value={formData.username} onChange={handleChange} /> <input type="password" name="password" placeholder="Password" value={formData.password} onChange={handleChange} /> <button type="submit">Login</button> </form> ); } export default Login;
-
-
Run the Django Server:
python manage.py runserver
-
Run the React Development Server:
npm start
- Open your browser and navigate to
http://localhost:3000/register
to register a new user. - After registration, navigate to
http://localhost:3000/login
to log in with the same user credentials. - Check the console or local storage for the JWT tokens received upon successful login.