Erlang-Web的Data flow

在Web应用程序中,大部分每次客户端的Http请求都需要,服务端都需要执行多个动作,不仅如此,有时候我们还需要多个动作之间具有一定的执顺序。比如用户新增一条记录到数据库,正常情况下的步骤是:1、判断用户是否登录;2、判断用户是否具有新增的权限;3、就是对用户输入的数据进行逻辑验证;最后一步才是把数据写入数据库中,简单的流程如下图:

在上图中,如果一个环节不通过,就不能继续执行下一个环节,而是跳转到相应的处理页面。

 

在Erlang Web中,数据流的处理环节大致上也是这样的,但是相对于其他的一个语言,又有一些不同的地方。在Erlang Web中,对于用户提交的请求,在控制器中导出了两个函数来执行数据流程,它们是dataflow/1 和error/2。

 

dataflow/1

函数dataflow/1负责在控制器模块中提供一个函数列表,列表中的函数按照顺序来执行,并且每个函数都必须返回{ok, Args} 或者{error, Reason}元组。Args将被用作下一个函数的参数被调用。如果列表中的函数返回{ok, Args},那么下一个函数将被调用,并且下一个函数的参数就是Args,否则error/2将被调用。dataflow的参数就是用户最终需要调用的函数的名称。dataflow的规则如下:

 

dataflow(ControllerFun) -> {BeforeList, AfterList} | BeforeList

BeforeList = AfterList = [Function]
ControllerFun = Function = atom()

 

 

error/2

如果dataflow中的列表内的函数执行不通过,并且返回{error, Reason},下一个函数的将被停止调用,并且error(FunName, Reason)函数将会调用(FunName就是返回{error, Reason}值的函数的名称)

 

当然,在控制器中并不一定要有dataflow函数,如果没有它,则标志的执行流程是,首先调用validate/1函数,然后再调用用户需要的正确函数。下面的图示直观的指出了控制器dataflow的流程:

 

 

下面用一个删除用户的示例来加深dataflow的理解,在删除用户的流程中,将要执行的环节有:

1、判断是否是通过https来连接。

2、判断当前用户是否具有权限

3、验证http请求的参数(比如请求的url是users/delete/3,就是删除ID为3的用户)

4、记录操作日志

5、执行删除用户函数

 

那么,为了满足以上的条件,模块user必须是要像这样才行:

-module(user).
-export([[dataflow/1, error/2,delete/1]]).

dataflow(delete) -> [check_https, check_permissions,validate_number, log].

check_https(_, _) ->
     case wpart:fget("__https") of
       true -> {ok, ok};
       false -> {error, no_https}
     end.
     

check_permissions(_, ok) ->
     Result = auth:permissions,
     case Result of
       not_logged_in              -> {error, not_logged_in};
       not_enough_permissions     -> {error, not_enough_permissions};
       _                          -> {ok, ok}
     end.
     
validate_number(_, ok) ->
     case hd(lists:reverse(string:tokens(wpart:fget("__path"), [$/]))) of
       N when is_integer(N)  -> {ok, N};
       _                     -> {error, invalid_url};
     end.

log(Action, Number) ->
     %% log activity to the file
     {ok, Number}.

error(check_https, no_https) ->
     {redirect, "https://" ++ e_conf:host() ++ wpart:fget("__path")};
     
error(check_permissions, not_logged_in) ->
     {redirect, "/login"};
     
error(check_permissions, not_enough_permissions) ->
     {template, "errors/not_enough_permissions.html"};
     
error(validate_number, invalid_url) ->
     {error, 404}.
     
delete(Number) ->
     %% delete user
     {template, "users/list.html"}.

 

在上面的代码中,用户请求时首先调用dataflow函数,参数就是最后需要执行删除用户的delete函数名。在调用dataflow后,列表中的check_https, check_permissions,validate_number, log四个函数将依次调用,如果其中一个函数返回error,那么与返回的值匹配的error/2函数将会执行。比如check_https函数返回{error, no_https},则error(check_https, no_https)函数将会执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值