Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Node modules
node_modules/

# Build directories
build/
dist/

# Dependency directories
jspm_packages/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# IDE directories
.vscode/
.idea/

# MacOS files
.DS_Store

# Windows files
Thumbs.db

# Django specific files
*.log
*.pot
*.pyc
__pycache__/
local_settings.py
db.sqlite3
db.sqlite3-journal

# Media files
media/

# Static files
staticfiles/

#venv
venv/

# re test comment bidon
55 changes: 43 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,52 @@
# Dev-Web-2024-2025
Template de repo pour le projet Dev Web 2024-2025
# guide utilisation pour lancer le site

## Comment copier ce Wiki?
<!-- On clone le repo, on se rend dans le projet et on active la branche dev -->
git clone https://github.com/DevIII-2025/Projet-Groupe10.git
cd Projet-Groupe10
git checkout dev

Pour récupérer le template et l'utiliser dans le cadre de votre projet, vous allez devoir faire un "fork" de ce repo. Cependant, le wiki n'est pas copié automatiquement. Suivez donc la procédure ci-dessous :
<!-- on crée un venv dans le dossier back/ pour éviter les conflits (seulement les projets en python) -->

1. Créez un fork de ce repository. Ce sera votre repo de projet, avec une URL de type `https://github.com/<username>/<repo-name>`.
2. Créez un wiki dans ce nouveau repo, avec une Home page vide par exemple.
3. Clonez le repo git du wiki original sur votre machine : `git clone https://github.com/EphecLLN/Dev-Web-2024.wiki.git`
4. Pour "pousser" le wiki présent sur votre machine vers votre repository de projet, vous allez changer le pointeur "remote" de votre copie locale :
`git remote add fork https://github.com/<username>/<repo-name>.wiki.git`
6. Forcez à présent la copie du wiki sur votre machine vers votre repository de projet. Cela écrasera le wiki vide que vous aviez créé plus tôt avec le template : `git push -f fork master`
cd back
python -m venv venv

## Utilisation
<!-- on active le venv (sous window) -->
venv\\Scripts\\activate

<!-- (sous linux et mac) -->
source venv/bin/activate

<!-- une fois dans le venv on peut maintenant installer les dépendances nécessaire
on commence par les requirements -->
pip install -r requirements.txt

<!-- on crée la DB -->
python manage.py migrate

<!-- on crée un nouveau fichier qui s'appelle .env (toujours dans back/) et on ajoute le token api qu'il faut récupérer sur le site tmdb -->

TMDB_API_TOKEN=VotreCleApi

<!-- voici un exemple de fichier .env :
TMDB_API_TOKEN=eyJhbGciOiJIUzI1NiJ9.....Dd7iaQKTKPb_LwIrMBJWAKtcmM
-->

<!-- on revient dans le terminal du back et on peut importer une centaine de films de l'api tmdb -->
python manage.py import_tmdb_movies

<!-- si tout se passe bien il devrait s'afficher en vert un truc du genre : "100 films importés avec succes !"
<!-- Maintenant qu'on est bon, on peut faire tourner le back -->

python manage.py runserver

<!-- pas oublier de sauver les fichiers à chaque fois ! -->


<!-- maintenant on se rend côté frontend dans un autre terminal et on fait les installations nécessaire -->
npm install

<!-- et on peut lancer le front -->
npm start

Il vous est demandé de respecter la table des matières du projet, afin que les enseignants puissent facilement retrouver les informations qu'ils cherchent. Si vous souhaitez effectuer un changement dans sa structure, parlez-en d'abord avec votre coach.

Si vous trouvez que les pages sont trop longues, vous pouvez en créer de nouvelles, mais vous devez alors vous assurez que les liens sont mis à jour dans la table des matières.
Empty file added back/backend/__init__.py
Empty file.
16 changes: 16 additions & 0 deletions back/backend/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for backend project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/5.1/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')

application = get_asgi_application()
150 changes: 150 additions & 0 deletions back/backend/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
"""
Django settings for backend project.

Generated by 'django-admin startproject' using Django 5.1.6.
"""

from pathlib import Path
import os
from datetime import timedelta
from dotenv import load_dotenv

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# Chargement des variables d'environnement
load_dotenv()

# Clé secrète Django (ne jamais exposer en prod)
SECRET_KEY = 'django-insecure-9%6v-es02t-b)=xxmxpk!^ym@+_ujle%%vpvy5qyqrigj@j6rs'

# Clé API TMDB depuis .env
TMDB_API_TOKEN = os.getenv('TMDB_API_TOKEN')

# DEBUG à désactiver en prod
DEBUG = True

ALLOWED_HOSTS = []

# Applications installées
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

# Libs externes
'rest_framework',
'rest_framework_simplejwt',
'rest_framework_simplejwt.token_blacklist',
'corsheaders',

# Apps internes
'movies',
'users',
]

# Middleware
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # Important: AVANT CommonMiddleware
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# Pour permettre à React d’accéder à l’API (à restreindre en prod)
CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000", # Ton frontend React
]

CORS_ALLOW_CREDENTIALS = True # ⚠️ Important pour autoriser les cookies


# Authentification REST avec JWT
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}

# Configuration de SimpleJWT
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'AUTH_HEADER_TYPES': ('Bearer',),
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'AUTH_COOKIE': 'access_token', # Nom du cookie
'AUTH_COOKIE_SECURE': False, # True en prod avec HTTPS
'AUTH_COOKIE_HTTP_ONLY': True,
'AUTH_COOKIE_PATH': '/',
'AUTH_COOKIE_SAMESITE': 'Lax',
}

ROOT_URLCONF = 'backend.urls'

# Templates Django
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

WSGI_APPLICATION = 'backend.wsgi.application'

# Base de données locale SQLite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}

# Validation des mots de passe
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]

# Internationalisation
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True

# Fichiers statiques
STATIC_URL = 'static/'

# Clé par défaut des champs auto
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

28 changes: 28 additions & 0 deletions back/backend/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""
URL configuration for backend project.

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/5.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('movies.urls')),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path("api/users/", include("users.urls")),

]
16 changes: 16 additions & 0 deletions back/backend/wsgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
WSGI config for backend project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')

application = get_wsgi_application()
17 changes: 17 additions & 0 deletions back/commandes.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# créer environnement virtuel
python3 -m venv venv

# activer environnement virtuel
# linux
source venv/bin/activate
# windows
venv\\Scripts\\activate

# installer les requirements
pip install -r requirements.txt

# créer la db:
python manage.py migrate

# lancer l'import de films
python manage.py import_tmdb_movies
22 changes: 22 additions & 0 deletions back/manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)


if __name__ == '__main__':
main()
Empty file added back/movies/__init__.py
Empty file.
Loading