Logo

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?;