用Spider抓取数据,然后再做各种处理,然后放到web页面供大家使用。
那么,就需要一个Web Server。
几乎每种语言都有一大堆Web Server开发框架,Python也不例外,比如这里http://www.zhihu.com/question/20706333。廖雪峰同学还有个python的教程http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014023080708565bc89d6ab886481fb25a16cdc3b773f0000。
选择合适的Web Server架构,可以减轻很多工作量。
应该用哪些指标选择Web Server呢?我的看法是,第一并发性好,速度要快,支持OnLine人数要高;第二,不需要配Nginx, Apache,我懒人;第三,项目是活的,有人维护;第四,框架的组件可用第三方替换;第五,有知名站点在用,经历过业界考验;第六,代码简洁。
通盘看下来,tornado跟这些指标契合度最高,速度够快,纯python,代码大概一万多行,单进程可以跑的很好,仅在开多进程时需要Nginx支持。Quora和知乎用的都是tornado。
tornado的官网在http://www.tornadoweb.cn/。
http://zuijiacanting.com的后端代码并不多,不到400行就搞定了。
一个最简单的tornado web server按照官方教程是这样的,创建一个s.py,其内容如下:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
在命令上执行"python s.py",然后在浏览器地址栏输入"localhost:8888",按回车,看到"Hello, world"。
在http://zuijiacanting.com的后端代码用get方法负责渲染页面,用post跟ajax交互,比如这种:
class ShopXXXHandler(tornado.web.RequestHandler):
def get(self):
template = os.path.join(TEMPLATE_DIR, "shxxxxx.html")
self.render(template)
def post(self):
shopid = xhtml_escape(self.request.arguments[‘shopid‘][0])
lng = xhtml_escape(self.request.arguments[‘lng‘][0])
lat = xhtml_escape(self.request.arguments[‘lat‘][0])
sqlquery = "insert into ShopXXXXTable(shopid, lng, lat) values (\‘%s\‘, \‘%s\‘, \‘%s\‘)" %(shopid, lng, lat)
MPDB.execute_rowcount(sqlquery);
self.write("ok")
return
还有一些细节问题,诸如特殊字符在页面显示的escap模块,避免跨站攻击xsrf策略,用logging模块处理日志,用cookie保存用户登录和访问等等。
如果你对写web server很有兴趣的话,不妨试试读下tornado的源代码,然后动手写个类似的东西,再用ApacheBench测试下效果,看看是不是可以提高。
Tornado的开发者之一Brett Taylor,是google地图的首任产品经理,FrindFeed的co-founder,FrindFeed被FaceBook收购之后,做Facebook的平台主管,后来做了CTO。再后来他辞职去做一个创业项目,叫Quip,效果大概就是在任何设备上都能运行能多人合作编辑还可以边打字边讨论能脱机能@某人能共享的字处理软件。一个网站的诞生07-- Tornado Web Server,布布扣,bubuko.com
一个网站的诞生07-- Tornado Web Server
原文:http://blog.csdn.net/lizhe_dashuju/article/details/38585371