Pourquoi Deployer Django sur Firebase ?
Deployer Django sur Firebase est une approche intéressante pour les développeurs qui souhaitent rendre leur application web plus performante, fiable et facile à déployer. Firebase offre une plateforme complète pour le développement d'applications mobiles et web avec des services tels que Firestore (base de données NoSQL), Authentication (gestion des utilisateurs) et Hosting (déploiement rapide).
Un cas d'usage concret serait un site web de petites tailles, comme un portfolio personnel ou une application web interne pour une entreprise. Firebase offre une solution complète qui permet de gérer les données en temps réel, l’authentification des utilisateurs et le déploiement rapide, tout cela sans avoir à vous soucier de l'infrastructure sous-jacente.
Prerequis
- Connaissances en Python et Django
- Connaissance de base en JavaScript et HTML/CSS
- Comptes Firebase et Google Cloud Platform (GCP)
- Environnement de développement Python configuré (Python 3.7+)
Concepts fondamentaux
1. Firebase Functions
Firebase Functions sont des fonctions exécutées sur le cloud, qui peuvent être déclenchées par divers événements tels que les requêtes HTTP, la modification d'une base de données Firestore ou l'authentification des utilisateurs.
Concept : Un trigger déclenche une fonction Firebase. Par exemple, une requête HTTP est un trigger pour une fonction qui exécute du code lorsqu'elle est reçue.
## 🌐 firebase_functions.py
import functions_framework
from firebase_admin import initialize_app, auth
initialize_app()
@functions_framework.http
def verify_user(request):
id_token = request.args.get("id_token")
try:
decoded_token = auth.verify_id_token(id_token)
return f"Authenticated as {decoded_token['email']}"
except ValueError:
return "Invalid ID token", 401
2. Firebase Hosting
Firebase Hosting permet de déployer rapidement des applications web statiques ou des Single Page Applications (SPA).
Concept : L'application est compilée en HTML, CSS et JavaScript avant d'être déployée sur Firebase Hosting.
## 🚀 Deployer l'application sur Firebase Hosting
npm install -g firebase-tools
firebase login
firebase init
## Sélectionnez "Hosting" et suivez les instructions
3. Firebase Authentication
Firebase Authentication facilite la gestion des utilisateurs pour vos applications.
Concept : Utilisez Firebase Authentication pour gérer l'authentification des utilisateurs, en fournissant une interface de connexion sécurisée et personnalisable.
## 📝 models.py
from django.contrib.auth.models import AbstractUser
from firebase_admin import auth
class CustomUser(AbstractUser):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
user = auth.create_user(
email=self.email,
password=self.password,
display_name=self.username
)
Mise en pratique : projet fil rouge
Mini-projet : Gestionnaire de Tâches
Étape 1 : Créer le projet Django et configurer Firebase
## 🏗️ Créer un nouveau projet Django
django-admin startproject task_manager
cd task_manager
## Installer les dépendances
pip install firebase-admin django-firebase-auth
Structure de base du projet :
task_manager/
├── manage.py
├── task_manager/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── tasks/
├── __init__.py
├── apps.py
├── models.py
├── admin.py
├── migrations/
│ └── 0001_initial.py
├── views.py
├── urls.py
└── tests.py
Étape 2 : Configurer Firebase
## 📝 settings.py
import os
from firebase_admin import credentials, initialize_app
## Configuration Firebase
FIREBASE_CREDENTIALS = {
"type": "service_account",
"project_id": "your-project-id",
"private_key_id": "your-private-key-id",
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-...@gserviceaccount.com",
"client_id": "your-client-id",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-...@gserviceaccount.com"
}
## Initialiser Firebase
cred = credentials.Certificate(FIREBASE_CREDENTIALS)
initialize_app(cred)
## Configuration Django-Firebase-Auth
INSTALLED_APPS += [
'firebase_auth',
]
FIREBASE_AUTH_FACEBOOK_CLIENT_ID = 'your-client-id'
FIREBASE_AUTH_GOOGLE_CLIENT_ID = 'your-client-id'
Étape 3 : Créer le modèle de tâche
## 📝 tasks/models.py
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=255)
description = models.TextField()
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
Étape 4 : Créer les vues et les URL pour le gestionnaire de tâches
## 📝 tasks/views.py
from django.shortcuts import render, redirect
from .models import Task
def task_list(request):
tasks = Task.objects.all()
return render(request, 'tasks/task_list.html', {'tasks': tasks})
def add_task(request):
if request.method == 'POST':
title = request.POST['title']
description = request.POST['description']
Task.objects.create(title=title, description=description)
return redirect('task_list')
return render(request, 'tasks/add_task.html')
def toggle_task(request, task_id):
task = Task.objects.get(id=task_id)
task.completed = not task.completed
task.save()
return redirect('task_list')
python
## 📝 tasks/urls.py
from django.urls import path
from .views import task_list, add_task, toggle_task
urlpatterns = [
path('', task_list, name='task_list'),
path('add/', add_task, name='add_task'),
path('toggle/<int:task_id>/', toggle_task, name='toggle_task'),
]
Étape 5 : Créer les templates HTML
<!-- 📝 tasks/templates/tasks/task_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Task Manager</title>
</head>
<body>
<h1>Task List</h1>
<ul>
{% for task in tasks %}
<li>
task.title - task.description
{% if not task.completed %}
<form action="{% url 'toggle_task' task.id %}" method="post">
{% csrf_token %}
<button type="submit">Mark as Done</button>
</form>
{% else %}
<span style="text-decoration: line-through;">task.title - task.description</span>
{% endif %}
</li>
{% endfor %}
</ul>
<a href="{% url 'add_task' %}">Add Task</a>
</body>
</html>
html
<!-- 📝 tasks/templates/tasks/add_task.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Add Task</title>
</head>
<body>
<h1>Add Task</h1>
<form method="post">
{% csrf_token %}
<label for="title">Title:</label>
<input type="text" id="title" name="title"><br><br>
<label for="description">Description:</label>
<textarea id="description" name="description"></textarea><br><br>
<button type="submit">Add Task</button>
</form>
</body>
</html>
Étape 6 : Déployer l'application sur Firebase Hosting
## 🚀 Deployer l'application sur Firebase Hosting
npm install -g firebase-tools
firebase login
firebase init
## Sélectionnez "Hosting" et suivez les instructions
Erreurs frequentes et debugging
Erreur 1 : ModuleNotFoundError: No module named 'firebase_admin'
Code incorrect :
import firebase_admin
from firebase_admin import credentials, initialize_app
cred = credentials.Certificate('path/to/credentials.json')
initialize_app(cred)
Code correct :
## Assurez-vous que firebase_admin est installé
pip install firebase-admin
import os
from firebase_admin import credentials, initialize_app
FIREBASE_CREDENTIALS = {
"type": "service_account",
"project_id": "your-project-id",
# ... autres champs de configuration Firebase
}
cred = credentials.Certificate(FIREBASE_CREDENTIALS)
initialize_app(cred)
Erreur 2 : firebase-admin is not installed
Code incorrect :
## Installer firebase-admin sans l'utiliser
pip install firebase-admin
Code correct :
## Assurez-vous que firebase_admin est utilisé dans votre code
pip install firebase-admin
import os
from firebase_admin import credentials, initialize_app
FIREBASE_CREDENTIALS = {
"type": "service_account",
"project_id": "your-project-id",
# ... autres champs de configuration Firebase
}
cred = credentials.Certificate(FIREBASE_CREDENTIALS)
initialize_app(cred)
Erreur 3 : ValueError: Invalid ID token
Code incorrect :
## Utiliser un jeton d'ID invalide
import firebase_admin
from firebase_admin import auth
id_token = "invalid-token"
decoded_token = auth.verify_id_token(id_token)
Code correct :
import firebase_admin
from firebase_admin import auth
def verify_user(request):
id_token = request.args.get("id_token")
try:
decoded_token = auth.verify_id_token(id_token)
return f"Authenticated as {decoded_token['email']}"
except ValueError:
return "Invalid ID token", 401
Pour aller plus loin
1. Utiliser Firebase Firestore pour la base de données
Firebase Firestore offre une base de données NoSQL déclarative qui permet de stocker et de synchroniser des données en temps réel.
- Concept : Utilisez Firebase Firestore comme backend pour votre application Django.
- Liens : Firebase Firestore
2. Intégrer Firebase Authentication avec OAuth
Intégrez Firebase Authentication avec des fournisseurs d'identité tiers tels que Google, Facebook et Twitter.
- Concept : Utilisez Firebase Authentication pour gérer l’authentification des utilisateurs via des providers OAuth.
- Liens : Firebase Authentication with OAuth
3. Créer une application mobile avec Flutter
Créez une application mobile qui interagit avec votre Django backend déployé sur Firebase.
- Concept : Utilisez Flutter pour créer une application mobile qui communique avec votre backend Django via des API REST.
- Liens : Flutter
Défi pratique : Ajouter l'authentification Google à votre application
Ajoutez la possibilité d’authentifier les utilisateurs de votre application Django en utilisant Firebase Authentication et le provider Google.
- Configurez Firebase Authentication pour utiliser le provider Google.
- Mettez à jour vos vues pour permettre à l'utilisateur de s'inscrire avec son compte Google.
- Testez votre fonctionnalité d'authentification.
Bonne chance avec ce projet! N'hésitez pas si vous avez des questions ou des problèmes.