V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tornado Documentation
http://www.v2ex.com/tornado/
Tornado on GitHub
https://github.com/facebook/tornado/
Tornado Gists
http://tornadogists.org/
luztak
V2EX  ›  Tornado

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

  •  
  •   luztak · 2012-07-04 15:36:48 +08:00 · 5363 次点击
    这是一个创建于 4285 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天写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   ·   我们的愿景   ·   实用小工具   ·   2621 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:51 · PVG 23:51 · LAX 08:51 · JFK 11:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.