Runique โ€” Rust carrying Django to new horizons

Runique A Rust web framework inspired by Django

Axum ยท SeaORM ยท Tera ยท Native CSRF ยท Built-in Admin

โ— โ— โ—
#[form(schema = blog, fields = [title, email, summary, website, content])]
pub struct BlogForm;

// Typed search (demo-app/src/backend/blog.rs)
search!(BlogEntity => Title icontains "runique")
    .all(&db).await?;

search!(BlogEntity => Id eq id)
    .first(&db).await?;
urlpatterns! {
    "/"          => view!{ index },        name = "index",
    "/blog/liste" => view!{ blog_list },    name = "blog_list",
    "/blog/{id}"  => view!{ blog_detail },  name = "blog_detail",
}

// Handler โ€” path param via axum Path + request.engine.db
pub async fn blog_detail(
    Path(id): Path<Pk>,
    mut request: Request,
) -> AppResult<Response> {
    ...
}
RuniqueApp::builder(config)
    .with_admin(admin::config)
    .build().await?
    .run().await?

// src/admin.rs โ€” typed ModelAdmin<blog::Entity>
ModelAdmin::new()
    .list(|l| {
        l.display([Title, Email, Website, Status])
            .links([Title])
            .filter([Status])
    })
    .form(|f| f.fields([Title, Email, Summary, Content, Status]))
$ cargo run โ†’ Admin available at /admin-runique/
.middleware(|m| {
    m.with_allowed_hosts(|h| {
        h.enabled(!is_debug())
            .host("runique.io")
    })
    .with_csp(|c| {
        c.policy(SecurityPolicy::strict())
            .scripts(vec!["'strict-dynamic'"])
    })
})

// CSRF enabled by default โ€” cannot be disabled
// Rate limiting, LoginGuard, Host validation built-in