Comparatif

Runique vs Django — Feature Comparison

CLI

CommandDjangoRunique
Create a projectdjango-admin startproject namerunique new name
Create an apppython manage.py startapp name
Generate migrationspython manage.py makemigrationsrunique makemigrations (detects changes from entities)
Apply migrationspython manage.py migraterunique migration up (wraps sea-orm-cli migrate up)
Rollback migrationspython manage.py migrate app 0001runique migration down --files ... (wraps sea-orm-cli migrate down)
Migration statusrunique migration status (wraps sea-orm-cli migrate status)
Create superuserpython manage.py createsuperuserrunique create-superuser
Start servicespython manage.py runservercargo runrunique start only to initialize/refresh the admin view

Routing

FeatureDjangoRunique
Route declarationurls.py with path()url.rs with axum Router
Dynamic routespath('users/<int:id>/', view).route("/users/:id", get(view))
Namespacesapp_name + include()Router::new().nest("/prefix", ...)
Reverse URL{% url "view_name" %} native{% link "name" %} → custom Tera function

Views / Handlers

FeatureDjangoRunique
Function viewdef my_view(request)async fn my_view(...)
Class-based viewclass MyView(View)
Session accessrequest.sessionrequest.session via context::template::Request (or Session axum extractor directly)
DB accessModel.objects.get(...)sea-orm query builders
Template renderingrender(request, "template.html", ctx)request.render("template.html") — context already in request.context
Redirectredirect("url_name")Redirect::to("/url") or reverse(&engine, "name") / reverse_with_parameters(...) (prelude)
Flash messagesmessages.success(request, "...")success!(message => "...") — macros success!, error!, info!, warning! (prelude)

Forms

FeatureDjangoRunique
Definitionclass MyForm(forms.Form) / class MyForm(ModelForm)#[derive(RuniqueForm)] struct MyForm (equivalent to ModelForm)
Validationform.is_valid()form.is_valid().await
Available fieldsCharField, EmailField, etc.TextField, EmailField, PasswordField, HiddenField, etc. (fixed list, no custom widget)
HTML rendering{{ form.as_p }}{% form.my_form %} (full form) or {% form.my_form.field %} (individual field)
CSRF includedautomaticautomatic — injected by Tera form_filter before the first field
Saveform.save()form.save(&db).await
Async validationnoyes (DB access possible)
File formsFileFieldMultipart partial

Templates

FeatureDjangoRunique
EngineDjango Template LanguageTera (Jinja2 syntax)
Inheritance{% extends %} / {% block %}same in Tera
Static files{% load static %} {% static "file" %}{% static "file" %} native
Media files{{ MEDIA_URL }}file{% media "file" %} native
Reverse URL{% url "name" %}{% link "name" %}
CSRF{% csrf_token %}{% csrf %}
Messages{% for m in messages %}{% messages %}
Internationalization{% trans "..." %}{{ t("section.key") }}

ORM / Database

FeatureDjangoRunique
ORMDjango ORM nativesea-orm
Model definitionclass User(models.Model)sea-orm entity (Rust struct) in src/entities/ (required folder, read by the parser)
Auto migrationsyes (change detection)runique makemigrations (change detection from entities)
Chainable QuerySetUser.objects.filter(...).order_by(...)sea-orm Select builder
RelationsForeignKey, ManyToMany, OneToOnesea-orm relations
Transactionswith transaction.atomic()db.transaction(...) sea-orm
Multi-DByesPostgreSQL, MySQL, SQLite
NoSQLvia third-party packagesvia third-party crates (e.g. mongodb)
Re-exportrunique::sea_orm + sea_query

Authentication

FeatureDjangoRunique
Login / Logoutauthenticate() + login()login(), login_staff(), logout()LoginGuard = brute-force middleware
Auth checkrequest.user.is_authenticatedis_authenticated(&session).await
Current userrequest.userCurrentUser (injected via load_user_middleware)
Route protection@login_requiredlogin_required middleware
Redirect if authenticatedmanualredirect_if_authenticated middleware
Sessionsnativetower-sessions
Brute-force protectiondjango-axes (third-party)LoginGuard native (attempts + lockout)
Password hashingPBKDF2 / argon2argon2, bcrypt, scrypt, custom (auto-detected at verification)
Email account activationnative (auth)missing
Password resetnativemissing (planned via lettre)
Force logout all sessionsyesmissing

Security

FeatureDjangoRunique
CSRFnativenative (constant-time via subtle)
CSPdjango-csp (third-party)native (use_nonce: true by default)
HSTSSECURE_HSTS_SECONDSnative (max-age=31536000; includeSubDomains)
SameSite cookiesconfigurableStrict by default
HttpOnly cookiesby defaultalways true
Host validationALLOWED_HOSTSRUNIQUE_ALLOWED_HOSTS + RUNIQUE_ENABLE_HOST_VALIDATION
Rate limitingdjango-ratelimit (third-party)RateLimiter native
Input sanitizationnative sanitize middleware
Secret key generationmanualrunique new generates 32 bytes hex automatically

Admin View

FeatureDjangoRunique
Activationadmin.site.register(Model)admin!{} macro + runique start
List / Create / Edit / Detail / Deletenativenative
List paginationnativemissing
list_displaynativemissing
Search / filtersnativemissing
Customizable templatesyesyes (Tera hierarchy)
Per-resource permissionsnativestored, not injected into Tera context
Admin account creationcreatesuperuserrunique create-superuser
Admin account from the appnono (same)

Email

FeatureDjangoRunique
Send emailsend_mail() nativemissing — plug lettre
Email templatesnativemissing
SMTP/console backendconfigurable

Internationalization

FeatureDjangoRunique
Supported languagesunlimited (.po files)9 (en, fr, it, es, de, pt, ja, zh, ru)
Auto language detectionLocaleMiddlewareLANG / LC_ALL env
Fallbackyesyes (Lang::En)
Framework translations.po/.moJSON files (14 sections, compiled into the binary)
t("key")_("...")t("section.key")Cow<'static, str>

Performance & Deployment

AspectDjangoRunique
RuntimeCPython (GIL)Tokio async Rust
Production serverGunicorn + Nginxcompiled binary (Axum/Hyper)
Memory footprint~50–100 MB~5–15 MB
Compilationcargo build --release
Dockeryesyes
Deploymentfly.io, Heroku, Azure, etc.same (static binary = simpler)

What Runique is still missing (summary)

  • Full auth flow (email activation, password reset)
  • Native email integration
  • Robust file upload (MIME validation, resize)
  • Admin pagination + list_display + filters
  • Runtime permissions in admin
  • Equivalent to django-simple-history
  • Native NoSQL (out of scope, plug mongodb)