
Я наконец-то сделал канал о том, как я негодую... о нашем фронтенде.
На самом деле писать буду о разработке в целом.
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
— набор сущностей