
Я наконец-то сделал канал о том, как я негодую... о нашем фронтенде.
На самом деле писать буду о разработке в целом.
Size: a a a







#[get(“/users/<user_id>”)]



#[post("/search")]
fn search_handler(auth: AuthOptional) -> ... { ... }if session.is_auth().401 и для этого не надо писать лишнего кода.router.post('/search', authOptional(), searchHandler)
router.post('/search/private', authRequired(), searchPrivateHandler)
app.resource("/account", |route| {
route.method(Method::POST).with(account_handler)
});Fn(..) -> impl Responder, это значит, что функция должна вернуть любой тип имплементирующий трейт Responder. Разработчики actix-web реализовали этот трейт для всех стандартных типов.Handler (ссылка). В этом файле есть имплементация Handler для функции.fn common_handler(req: HttpRequest<State>) -> impl Responder { ... }fn custom((req, auth, query): (HttpRequest<State>, Auth, Query<Info>)) -> impl Responder { ... }Auth, Query<T> называются Extractors и их задача вытаскивать что-то из запроса в хендлер, тоже своеобразный middleware. Хотя actix имеет полноценные middlewares, экстракторы очень полезны, так как позволяют делать асинхронные экстракторы и выполнять отлуп запроса, до исполнения хендлера.Auth и AuthOptional. Обе реализуют трейт FromRequest<State>.Auth делает отлуп запроса, если пользователь пришел без аутентификации или с дохлым токеном (и т.д.). AuthOptional просто дергает метод Auth::from_request но не делает отлуп пользователю, а заворачивает сессию в Option.SessionBackend и пытаться крутиться вокруг него.







features/ — набор сущностейfeatures/name — одна сущность./pages/ — набор сущностей./reducer.js — одна сущность./actions.js — набор сущностей
