makrdown 在 mac 有个不错的图形编辑器Mou Mou左边编辑，右边自动预览，相当巴适，可导出为html和pdf。 初学tornado，于是想到写个简单的web服务器，让浏览器来预览编写的md文件。 python有markdown，markdown2两个库，有如下区别：markdown2号称比markdown快，而且更接近最初perl版本的实现。两个支持的extras不同，markdown2支持wiki-table，markdown支持的是PHP Markdown Extra的table格式。由于Mou支持的是PHP Markdown Extra的table格式，所以选择markdown库来实现。安装库 $sudo pip install tornado $sudo pip install markdown 服务器根下文件组织如下： ./server.py ./css/md.css ./md/test.md ./md/test.png需求：访问http://127.0.0.1:8080/，自动罗列服务器跟下的所有md文件。以.md结尾的文件自动转换为html需要能够访问到md引用的图片实现要点： 1、要启动markdown的extras支持table。 2、tornado的handle正则表达式正确处理不同类型文件。 3、注意URI解码，还原为中文。完整代码如下： #!/usr/bin/env python # -*- coding: UTF-8 -*- import tornado.ioloop import tornado.web import markdown import codecs import os import urllib webRoot = os.path.split(os.path.realpath(__file__))[0] class mdHandler(tornado.web.RequestHandler): def mdToHtml(self, path): output = """ """ input_file = codecs.open(path, "r", "utf8") text = input_file.read() html = markdown.markdown(text, ['tables']) output += html output += "" return output def get(self, args): uriPath = urllib.unquote(self.request.path) # decode URI if uriPath.startswith("/"): uriPath = uriPath[1:] mdPath = os.path.join(webRoot, uriPath) if os.path.exists(mdPath): self.write(self.mdToHtml(mdPath)) else: self.send_error(404) class indexHandler(tornado.web.RequestHandler): def getFileList(self): link = "" for item in os.walk(webRoot): for filename in item[2]: filePath = item[0] + os.sep + filename if '.' != filename[0] and os.path.isfile(filePath) and filename.endswith(".md"): link += "%s" %(filePath[len(webRoot):], filename) return link def get(self): self.write('' '' '' '' '' '%s' '' %(self.getFileList())) application = tornado.web.Application([ (r'/', indexHandler), (r'/(.*\.md\Z)', mdHandler),# .md file (r'/css/(.*)',tornado.web.StaticFileHandler, {'path':os.path.join(webRoot, 'css')}), (r'/(.*\.[pP][nN][gG]\Z)',tornado.web.StaticFileHandler, {'path':webRoot}), # .png file (r'/(.*\.[jJ][pP][gG]\Z)',tornado.web.StaticFileHandler, {'path':webRoot}), # .jpg file ]) if __name__ == "__main__": application.listen(8080) tornado.ioloop.IOLoop.instance().start() 这里使用到了Mou中的css配置文件， 在路径~/Library/Application\ Support/Mou/CSS/下面有4个css，选择一个更名为md.css放到css文件夹下面。
很早很早前接触了下web.py，平时并没什么使用机会，最近更新python知识，比较了下几个轻量框架，准备学习下tornado。 这里提下web.py的作者Aaron Swartz，今年早些时候自杀身亡。 英才早逝，Aaron Swartz开创了轻量web框架的世界，才有了后来的tornado等框架。 tornado来自web.py，同web.py一样，自带一个http服务器。 web.py的服务器多用来调试方便，而tornado的服务器性能很高，可直接用于生产环境，主要得益已它的异步设计。 在部署上，一般也不是直接用tornado的http服务器，而是在前端用nginx做负载均衡。同时tornado上传有限制： 1、Tornado最大只支持100M，要支持更大的请求，需要override httpserver。 2、Tornado是单进程异步模式，上传大文件会阻塞整个Tornado进程，而这个时间还可能会比较长。 而通常的解决方案也是用nginx的Nginx upload module选择了tornado，一定程度上选择了nginx。