在 Web 编程中,表单提交的常见模式是:
- 如果表单有效,则重定向到另一个页面(Post/Redirect/Get)。
- 如果表单无效,请重新显示表单(这次可能包括错误消息)。
我如何在 Ocsigen 中表达这一点?
我一直在阅读文档,但无法弄清楚如何完成这个简单(而且非常常见)的任务。
示例用例:
假设我有一个登录表单,可以防止未经授权访问管理面板(该页面只能由管理员访问)。如果用户在登录表单中提供了正确的凭据,则应将用户重定向到管理面板。如果凭据不正确,则应将用户重定向回登录表单。到目前为止,我已经成功实现了这个功能。
但是,在实现以下内容时我不知所措:如果用户已经登录并尝试访问登录表单,则应将用户重定向到管理面板。此外,如果用户未登录并尝试访问管理面板,则应将用户重定向到登录表单。
下面是我卡住的地方的代码:
(* Secret login credentials. *)
let username = "admin"
let password = "123456"
(* Create Eliom services. *)
let login_form_service = Eliom_service.create
~path:(Eliom_service.Path ["login"])
~meth:(Eliom_service.Get Eliom_parameter.unit)
()
let login_service = Eliom_service.create_attached_post
~fallback:login_form_service
~post_params:Eliom_parameter.(string "user" ** string "pass")
()
let admin_panel_service = Eliom_service.create
~path:(Eliom_service.Path ["admin-panel"])
~meth:(Eliom_service.Get Eliom_parameter.unit)
()
let session_username : string option Eliom_reference.eref =
Eliom_reference.eref ~scope:Eliom_common.default_session_scope None
(* Register Eliom services. *)
let () = Eliom_content.Html.D.(
Eliom_registration.Html.register
~service:login_form_service
(fun () () -> Lwt.return
(Eliom_tools.D.html
~title:"Login"
(body [h1 [pcdata "Login"];
Form.post_form
~service:login_service
(fun (user, pass) ->
[fieldset
[label [pcdata "Username: "];
Form.input ~input_type:`Text
~name:user
Form.string;
br ();
label [pcdata "Password: "];
Form.input ~input_type:`Password
~name:pass
Form.string;
br ();
Form.input ~input_type:`Submit
~value:"Login"
Form.string
]]) ()])));
Eliom_registration.Redirection.register
~service:login_service
(fun () (user, pass) ->
if user = username && pass = password then (
Eliom_reference.set session_username (Some username);
Lwt.return (Eliom_registration.Redirection admin_panel_service))
else
Lwt.return (Eliom_registration.Redirection login_form_service));
Eliom_registration.Html.register
~service:admin_panel_service
(fun () () ->
(* Admin panel html here ... *))
);
解决这个问题的正确方法是什么?
谢谢你。