Comparatif Django
Equivalences routes, vues, formulaires, ORM, securite.
Routes
urls
-- Django (urls.py)
urlpatterns = [
path("articles/", views.article_list, name="article_list"),
path("articles/<id>/", views.article_detail, name="article_detail"),
]
-- Runique (url.rs)
urlpatterns! {
"/articles" => view! { article_list }, name = "article_list",
"/articles/{id}" => view! { article_detail }, name = "article_detail",
}
Routes
urls
-- Django (urls.py)
urlpatterns = [
path("articles/", views.article_list, name="article_list"),
path("articles/<id>/", views.article_detail, name="article_detail"),
]
-- Runique (url.rs)
urlpatterns! {
"/articles" => view! { article_list }, name = "article_list",
"/articles/{id}" => view! { article_detail }, name = "article_detail",
}
Vues
views
-- Django (views.py)
def article_list(request):
articles = Article.objects.all()
return render(request, "articles.html", {"articles": articles})
-- Runique (views.rs)
pub async fn article_list(mut request: Request) -> AppResult<Response> {
let db = request.engine.db.clone();
let articles = article::Entity::find().all(&*db).await.unwrap_or_default();
context_update!(request => { "articles" => &articles });
request.render("articles.html")
}
Vues
views
-- Django (views.py)
def article_list(request):
articles = Article.objects.all()
return render(request, "articles.html", {"articles": articles})
-- Runique (views.rs)
pub async fn article_list(mut request: Request) -> AppResult<Response> {
let db = request.engine.db.clone();
let articles = article::Entity::find().all(&*db).await.unwrap_or_default();
context_update!(request => { "articles" => &articles });
request.render("articles.html")
}
Modeles
models
-- Django (models.py)
class Article(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
-- Runique (entities/article.rs)
model! {
Article,
table: "article",
pk: id => i32,
fields: {
title: String [required, max_len(255)],
content: text [required],
author_id: i32 [required, fk(eihwaz_users.id, cascade)],
}
}
Modeles
models
-- Django (models.py)
class Article(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
-- Runique (entities/article.rs)
model! {
Article,
table: "article",
pk: id => i32,
fields: {
title: String [required, max_len(255)],
content: text [required],
author_id: i32 [required, fk(eihwaz_users.id, cascade)],
}
}
Formulaires
forms
-- Django (forms.py)
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ["title", "content"]
-- Runique (formulaire/article.rs)
#[form(schema = article, fields = [title, content])]
pub struct ArticleForm;
#[async_trait]
impl RuniqueForm for ArticleForm {
impl_form_access!(model);
}
Formulaires
forms
-- Django (forms.py)
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ["title", "content"]
-- Runique (formulaire/article.rs)
#[form(schema = article, fields = [title, content])]
pub struct ArticleForm;
#[async_trait]
impl RuniqueForm for ArticleForm {
impl_form_access!(model);
}
Configuration
settings
-- Django (settings.py)
SECRET_KEY = "..."
DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", ... } }
DEBUG = True
-- Runique (.env + main.rs)
SECRET_KEY=...
DATABASE_URL=postgres://user:pass@localhost/db
DEBUG=true
// main.rs
let config = RuniqueConfig::from_env();
let db = DatabaseConfig::from_env()?.build().connect().await?;
Configuration
settings
-- Django (settings.py)
SECRET_KEY = "..."
DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", ... } }
DEBUG = True
-- Runique (.env + main.rs)
SECRET_KEY=...
DATABASE_URL=postgres://user:pass@localhost/db
DEBUG=true
// main.rs
let config = RuniqueConfig::from_env();
let db = DatabaseConfig::from_env()?.build().connect().await?;