Comparatif

Comparatif Runique vs Django

CLI

CommandeDjangoRunique
Créer un projetdjango-admin startproject nomrunique new nom
Créer une apppython manage.py startapp nom
Migrations (générer)python manage.py makemigrationsrunique makemigrations
Migrations (appliquer)python manage.py migraterunique migration up (wrapper sea-orm-cli migrate up)
Migrations (annuler)python manage.py migrate app 0001runique migration down --files ... (wrapper sea-orm-cli migrate down)
Statut migrationsrunique migration status (wrapper sea-orm-cli migrate status)
Créer superuserpython manage.py createsuperuserrunique create-superuser
Démarrer les servicespython manage.py runservercargo runrunique start uniquement pour initialiser/renouveler la vue admin

Routing

FonctionnalitéDjangoRunique
Déclaration des routesurls.py avec path()url.rs avec macro urlpatterns!{}
Routes dynamiquespath('users/<int:id>/', view)"/users/{id}" dans urlpatterns!
Namespacesapp_name + include()Router::new().nest("/prefix", ...)
Reverse URL{% url "nom_vue" %} natif{% link "nom_vue" %} → Tera function custom
Récupérer un paramètre de cheminkwargs['id'] via request.resolver_matchPath(id): Path<i32> en paramètre de vue (extractor Axum) — request.path_param("id") prévu
Récupérer un query paramrequest.GET.get('key')Query(params): Query<HashMap<...>> en paramètre de vue — request.query_param("key") prévu

Vues / Handlers

FonctionnalitéDjangoRunique
Vue fonctiondef ma_vue(request)async fn ma_vue(...)
Vue classeclass MaVue(View)
Accès sessionrequest.sessionrequest.session via context::template::Request (ou Session extractor axum directement)
Accès DBModel.objects.get(...)sea-orm query builders
Rendu templaterender(request, "template.html", ctx)request.render("template.html") — contexte déjà dans request.context
Redirectredirect("nom_url")Redirect::to("/url") ou reverse(&engine, "nom") / reverse_with_parameters(...) (prelude)
Messages flashmessages.success(request, "...")success!(message => "...") — macros success!, error!, info!, warning! (prelude)

Formulaires

FonctionnalitéDjangoRunique
Définitionclass MonForm(forms.Form) / class MonForm(ModelForm)#[derive(RuniqueForm)] struct MonForm (équivalent ModelForm)
Validationform.is_valid()form.is_valid().await
Champs disponiblesCharField, EmailField, etc.TextField, EmailField, PasswordField, HiddenField, etc. (liste fixe, pas de widget custom)
Rendu HTML{{ form.as_p }}{% form.nom_form %} (formulaire entier) ou {% form.nom_form.champ %} (champ individuel)
CSRF intégréautomatiqueautomatique — injecté par le filtre Tera form_filter avant le premier champ
Sauvegardeform.save()form.save(&db).await
Validation asyncnonoui (accès DB possible)
Formulaires fichierFileFieldMultipart partiel

Templates

FonctionnalitéDjangoRunique
MoteurDjango Template LanguageTera (syntaxe Jinja2)
Héritage{% extends %} / {% block %}idem Tera
Fichiers statiques{% load static %} {% static "file" %}{% static "file" %} natif
Fichiers media{{ MEDIA_URL }}file{% media "file" %} natif
URL reverse{% url "nom" %}{% link "nom" %}
CSRF{% csrf_token %}{% csrf %}
Messages{% for m in messages %}{% messages %}
Internationalisation{% trans "..." %}{{ t("section.clé") }}

ORM / Base de données

FonctionnalitéDjangoRunique
ORMDjango ORM natifsea-orm
Définition modèleclass User(models.Model)entité sea-orm (struct Rust) dans src/entities/ (dossier imposé, lu par le parser)
Migrations autooui (détection changements)runique makemigrations (détection changements depuis entités)
QuerySet chaînableUser.objects.filter(...).order_by(...)sea-orm Select builder
RelationsForeignKey, ManyToMany, OneToOneRelations sea-orm
Transactionswith transaction.atomic()db.transaction(...) sea-orm
Multi-DBouiPostgreSQL, MySQL, SQLite
NoSQLvia packages tiersvia crates tierces (ex. mongodb)
Re-exportrunique::sea_orm + sea_query

Authentification

FonctionnalitéDjangoRunique
Login / Logoutauthenticate() + login()login(), login_staff(), logout()LoginGuard = middleware anti-brute force
Vérif authentificationrequest.user.is_authenticatedis_authenticated(&session).await
Utilisateur courantrequest.userCurrentUser (injecté via load_user_middleware)
Protection route@login_requiredmiddleware login_required
Redirection si connectémanuelmiddleware redirect_if_authenticated
Sessionsnatiftower-sessions
Protection brute forcedjango-axes (tiers)LoginGuard natif (tentatives + lockout)
Hashage mot de passePBKDF2 / argon2argon2, bcrypt, scrypt, custom (détection automatique à la vérification)
Activation compte emailnatif (auth)manquant
Reset passwordnatifmanquant (prévu via lettre)
Déconnexion forcée toutes sessionsouimanquant

Sécurité

FonctionnalitéDjangoRunique
CSRFnatifnatif (constant-time via subtle)
CSPdjango-csp (tiers)natif (use_nonce: true par défaut)
HSTSSECURE_HSTS_SECONDSnatif (max-age=31536000; includeSubDomains)
SameSite cookiesconfigurableStrict par défaut
HttpOnly cookiespar défauttoujours true
Validation hôtesALLOWED_HOSTSRUNIQUE_ALLOWED_HOSTS + RUNIQUE_ENABLE_HOST_VALIDATION
Rate limitingdjango-ratelimit (tiers)RateLimiter natif
Sanitisation inputsmiddleware sanitize natif
Secret key généréemanuelrunique new génère 32 bytes hex automatiquement

Vue Admin

FonctionnalitéDjangoRunique
Activationadmin.site.register(Model)macro admin!{} + runique start
List / Create / Edit / Detail / Deletenatifnatif
Pagination listenatifmanquant
list_displaynatifmanquant
Recherche / filtresnatifmanquant
Templates personnalisablesouioui (hiérarchie Tera)
Permissions par ressourcenatifstockées, non injectées dans le contexte Tera
Création compte admincreatesuperuserrunique create-superuser
Compte admin depuis l'appnonnon (identique)

Email

FonctionnalitéDjangoRunique
Envoi emailsend_mail() natifmanquantlettre à brancher
Templates emailnatifmanquant
Backend SMTP/consoleconfigurable

Internationalisation

FonctionnalitéDjangoRunique
Langues supportéesillimitées (fichiers .po)9 (en, fr, it, es, de, pt, ja, zh, ru)
Détection auto langueLocaleMiddlewareLANG / LC_ALL env
Fallbackouioui (Lang::En)
Traductions framework.po/.mofichiers JSON (14 sections, compilés dans le binaire)
t("clé")_("...")t("section.clé")Cow<'static, str>

Performance & Déploiement

AspectDjangoRunique
RuntimeCPython (GIL)Tokio async Rust
Serveur prodGunicorn + Nginxbinaire compilé (Axum/Hyper)
Empreinte mémoire~50–100 MB~5–15 MB
Compilationcargo build --release
Dockerouioui
Déploiementfly.io, Heroku, Azure, etc.idem (binaire statique = plus simple)

Ce qui manque encore à Runique (résumé)

  • Flux auth complet (activation email, reset password)
  • Intégration email native
  • Upload fichier robuste (validation MIME, resize)
  • Pagination admin + list_display + filtres
  • Permissions runtime dans l'admin
  • Équivalent django-simple-history
  • NoSQL natif (hors scope, brancher mongodb)
  • request.path_param() / request.query_param() — actuellement via extractors Axum bruts (voir roadmap)