有种把数据处理写成backend/api的冲动 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luztak
V2EX    Tornado

有种把数据处理写成backend/api的冲动

  •  
  •   luztak 2012-07-04 15:36:48 +08:00 5858 次点击
    这是一个创建于 4846 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天写tornado的时候看着几乎每个Handler都有一句self.db.xx.find,头疼,想把它改成api/client,Handler通过api取数据……
    球拍砖,球指点,球浇水 XD
    26 条回复    1970-01-01 08:00:00 +08:00
    c
        1
    c  
       2012-07-04 15:38:10 +08:00
    luztak
        2
    luztak  
    OP
       2012-07-04 15:40:45 +08:00
    啊?
    我的意思是Web部分和数据部分分开.要127.0.0.1的那种.想用json的0 0
    INT21H
        3
    INT21H  
       2012-07-04 15:47:29 +08:00
    激进点,用erlang写个api读取数据,前端全部ajax处理,tornado直接做web server这样如何?
    luztak
        4
    luztak  
    OP
       2012-07-04 15:49:06 +08:00
    @INT2H Nice idea!
    不过还没学Erlang.正好去学XD
    INT21H
        5
    INT21H  
       2012-07-04 15:54:12 +08:00
    @luztak 我也在用tornado,其实erlang的特性就是并发,tornado也提供了比较好的异步IO,可以做backend提供api用。

    可以看一下这个erlang程序 http://www.chicagoboss.org/
    luztak
        6
    luztak  
    OP
       2012-07-04 15:56:27 +08:00
    reorx
        7
    reorx  
       2012-07-04 16:00:56 +08:00
    如果tornado作为client,连接API进行数据处理,数据io可能成为最大的瓶颈,因为你的每一次读写都造成了4次数据的往返。实际上tornado反而更适合做你说的backend/api,而不是提供页面的服务。
    adow
        8
    adow  
       2012-07-04 16:06:11 +08:00
    我现在就是tornado 中一堆handler只输出json,然后web静态页面上全部ajax调用
    luztak
        9
    luztak  
    OP
       2012-07-04 16:09:36 +08:00
    @reorx 然后ajax去取tornado的结果?
    @adow 这样的话……页面显示Handler岂不是一片def get(self): self.render('xx.html') ?
    luztak
        10
    luztak  
    OP
       2012-07-04 16:14:30 +08:00
    @xeorx 咦……
    每次读,tornado->api请求,api->tornado结果
    每次写,tornado->api请求+数据,api->tornado结果
    你的意思是一次操作包含读和写么?但这里tornado每次要么get要么post,post部分是交给ajax做的
    这样也要全部算上?
    adow
        11
    adow  
       2012-07-04 16:16:05 +08:00
    @luztak 还好啦,比如我弄了好多个静态页面,当然全部放在staitc目录中,原来可以通过/static/index.html 来直接访问,不过url看上去不是很带感.

    然后写了一个叫PageHandler的,把/:xxx 的全部用xxx.html 渲染,这样简单些.

    不过如果url要求复杂的话只能一个个对应各自的handler了吧,我想反正也就写一个self.render还不算很复杂。

    我现在做的这个用PageHander就足够了
    reorx
        12
    reorx  
       2012-07-04 16:20:23 +08:00
    @luztak 嗯,没错,我一般就是这样设计的架构,你可以看一下我做的一个玩具,tornado只负责提供数据,渲染和交互全部由js完成:

    chatroom.reorx.com
    luztak
        13
    luztak  
    OP
       2012-07-04 16:21:09 +08:00
    @adow 牛人@ @
    我朋友写的个论坛的templates里就是一堆又一堆{% %}/{{ }},.py就是一堆self.db
    不过总感觉Ajax效率比较低……因为Ajax get/post回来的结果还要getElementById.innerHTML写进去(jQ我会,只不过觉得开销更大0 0),而页面元素一多这事效率就低了
    luztak
        14
    luztak  
    OP
       2012-07-04 16:23:33 +08:00
    @xeorx @adow 森森觉得自己孤陋寡闻了0 0
    谢谢各位的建议,我就用ajax做了.
    luztak
        15
    luztak  
    OP
       2012-07-04 16:23:40 +08:00
    @xeorx @adow 森森觉得自己孤陋寡闻了0 0
    谢谢各位的建议,我就用ajax做了.
    adow
        16
    adow  
       2012-07-04 16:24:35 +08:00
    @luztak 我以前经常弄模版什么的,美工或者前端又不肯写那个模版语言,所以很多时候都是自己做了很多前端工作,而且我一些html/js/css就效率底下,然后我就和前端商量这样,他到还蛮乐意,因为他自己可以实现想要的各种折腾。只是这样的做法我觉得不适合大访问量的网站吧,因为很多请求来着,真的每次读写都是get/post,一个页面有时很多个请求
    luztak
        17
    luztak  
    OP
       2012-07-04 16:29:20 +08:00
    @adow 也是……我去试试Erlang.本地socket感觉要好些.
    btw,Erlang->贰郎0 0
    reorx
        18
    reorx  
       2012-07-04 16:41:54 +08:00
    @luztak 啊,你名字打错了没有at到我,就没有看到#10的问题。

    你理解的没错,其实是2次往返,4次传输 (request - response * 2),不过多一层通信总是多一些麻烦,所以不到万不得已我不会选择那样做。如果真的要做服务间的通信,用protocol buffers或者thrift这些成熟的方案吧。
    luztak
        19
    luztak  
    OP
       2012-07-04 16:55:01 +08:00
    @reorx 不知道怎么就敲成施乐了0 0
    感觉thrift不错,fb家的东西.Thx.
    binux
        20
    binux  
       2012-07-04 17:10:47 +08:00
    用PHP这么干过,没用模板,还是XML。。
    用aria2输出的JSON-RPC的api做过。。

    不过,如无必要,还是算了。。
    kernel1983
        21
    kernel1983  
       2012-08-26 22:26:36 +08:00
    API化啊, 我已经有好几个网站这么做了, 网站做好了基本mobile API也做好了
    秘诀是你需要一个js template引擎, 因为这个underscore.js变得和jquery一样成为了标配
    fanzeyi
        22
    fanzeyi  
       2012-08-26 22:46:56 +08:00
    https://github.com/fanzeyi/Vulpix/blob/master/judge/db/__init__.py#L24

    =.= 对于一大堆 self.db 我是这么解决的 =v= 弄个 Mixin 模块
    DeepBlue
        23
    DeepBlue  
       2012-08-26 23:14:18 +08:00
    要不要试一下nginx conf编辑?好像叫做OpenResty的貌似
    imcj
        24
    imcj  
       2012-08-26 23:21:24 +08:00
    Java里面是这样做的,一般放在DAO里面。他们把这个叫做MVC
    zieglar
        25
    zieglar  
       2012-08-26 23:22:50 +08:00
    @kernel1983 求详解
    kernel1983
        26
    kernel1983  
       2012-09-27 10:47:06 +08:00
    @zieglar 十分钟看一下 underscore.js 吧

    另外, 为了SEO, 你的网页在用户未登录的情况下必须渲染静态html

    或者折中的方法, 总是渲染网页第一页, 然后ajax加载其他的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1018 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 18:33 PVG 02:33 LAX 11:33 JFK 14:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86