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']form.cleaned_* ou request.path_param("id")
Récupérer un query paramrequest.GET.get('key')form.cleaned_* ou request.from_url("key")

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(...)Model::objects.get(...) (via impl_objects!) ou 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)#[form] struct (équivalent ModelForm) ou RuniqueForm manuel
Validationform.is_valid()form.is_valid().await
Champs disponiblesCharField, EmailField, etc.TextField, EmailField, PasswordField, HiddenField, ChoiceField, NumericField, BooleanField, FileField, DateTimeField, DurationField
Rendu HTML{{ form.as_p }}{% form.nom_form %} (formulaire entier) ou {% form.nom_form.champ %} (champ individuel)
CSRF intégréautomatiqueautomatique — injecté avant le premier champ
Sauvegardeform.save()form.save(&db).await (si #[form])
Accès aux donnéesform.cleaned_data['clé']form.cleaned_*("clé") (ex: string, i32, bool, uuid, etc.)
Validation asyncnonoui (accès DB direct dans clean())
Formulaires fichierFileFieldMultipart natif avec validation dimensions/format

Templates

FonctionnalitéDjangoRunique
MoteurDjango Template LanguageTera (syntaxe Jinja2 / Django-like)
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é") }} ou {{ tf("...", ["var"]) }}

ORM / Base de données

FonctionnalitéDjangoRunique
ORMDjango ORM natifsea-orm (Rust async)
Définition modèleclass User(models.Model)struct Rust annotée + model!{} macro
Migrations autooui (détection changements)runique makemigrations
QuerySet chaînableUser.objects.filter(...).order_by(...)User::objects.filter(...).order_by(...) (via impl_objects!)
RelationsForeignKey, ManyToMany, OneToOneRelations sea-orm standard
Transactionswith transaction.atomic()db.transaction(...)
Multi-DBouiPostgreSQL, MySQL, SQLite
NoSQLvia packages tiersvia crates tierces (ex. mongodb)
Re-exportrunique::sea_orm + sea_query intégrés

Authentification

FonctionnalitéDjangoRunique
Login / Logoutauthenticate() + login()auth_login(...), logout()
Vérif authentificationrequest.user.is_authenticatedis_authenticated(&session).await
Utilisateur courantrequest.userCurrentUser (injecté via middleware)
Protection route@login_requiredpattern if !is_authenticated(&session).await { ... }
Sessionsnatiftower-sessions (DB backend)
Protection brute forcedjango-axes (tiers)LoginGuard natif (lockout auto)
Hashage mot de passePBKDF2 / argon2argon2 par défaut, multi-algos supportés
Activation compte emailnatif (auth)intégré au lien de réinitialisation/création password
Reset passwordnatifhandle_forgot_password + handle_password_reset natifs
Déconnexion forcéeouiRuniqueSessionStore::invalidate_all(user_id)

Sécurité

FonctionnalitéDjangoRunique
CSRFnatifnatif (constant-time validation)
CSPdjango-csp (tiers)natif (use_nonce: true par défaut)
HSTSSECURE_HSTS_SECONDSnatif
SameSite cookiesconfigurableStrict par défaut
HttpOnly cookiespar défauttoujours true
Rate limitingdjango-ratelimit (tiers)RateLimiter natif
Sanitisation inputsmiddleware sanitize natif
Secret keymanuelgénérée auto à l''install

Vue Admin

FonctionnalitéDjangoRunique
Activationadmin.site.register(Model)macro admin!{}
CRUD completnatifnatif
Pagination listenatif.pagination(n) dans DisplayConfig
list_displaynatif.columns_include() / .columns_exclude()
Recherche / filtresnatif.list_filter() + champ de recherche automatique
Templates customouioui (hiérarchie Tera)
Permissionspar ressourceRBAC dynamique (Groupes / Permissions)

Email

FonctionnalitéDjangoRunique
Envoi emailsend_mail() natifutils::Email::new().send() natif
Templates emailnatifTera templates supportés via html(body)
Backend SMTPconfigurableconfiguration via .env

Internationalisation

FonctionnalitéDjangoRunique
Langues supportéesillimitées9 langues par défaut (JSON compilé)
Fallbackouioui (Lang::En)
t("clé")_("...")t("section.clé")

Performance & Déploiement

AspectDjangoRunique
RuntimeCPython (interprété)Tokio async Rust (compilé)
Empreinte mémoire~50–100 MB~5–15 MB
Compilationbinaire statique unique

Ce qu'il manque encore (comparé à Django)

Runique se rapproche de la complétude fonctionnelle de Django, mais quelques éléments restent en chantier :

  • File upload amélioré : Le redimensionnement automatique d''image nativement côté serveur (resize/cropping).
  • Équivalent à django-simple-history : Un système d''audit log intégré pour tracer l''historique de chaque modification en base de données.
  • NoSQL Natif (Toujours hors périmètre principal, mais intégration MongoDB simplifiée prévue).
  • request.path_param() / request.query_param() — actuellement via extractors Axum bruts (voir roadmap)