Zoom.Quiet

python-cn 邮件列表大妈,Python 中文社区骨灰级人物!哲思社区核心成员,金山过程改进经理。 ...

↑我也要推荐

车百科SAE升级Bottle.v0.11手记

发布时间:2012-04-03 11:58:23, 关注:+7747, 赞美:+8, 不爽:+10

本文标签: sae

原始出处: chinakr's Blog (chinakr的博客)

为什么要升级到Bottle v0.11

说明:事实上Bottle官方发布的最新版本是发布于2012-02-11的v0.10.9,开发中的Bottle版本的称呼是dev,并不存在v0.11这个概念。本文中我借用v0.11来称呼当前的dev,只是因为个人认为v0.11可能很快会发布,不是为了抢沙发进行的SEO,特此澄清。

为什么要使用Bottle

在回答“为什么要升级到Bottle v0.11”之前先回答为什么要使用Bottle。

web2py是我最常使用的Python Web开发框架,它具有开发、部署简单、高效的特点。web2py+SQLite的组合应该是最适合个人站长的解决方案,一个Web应用或网站,包括数据在内,用几分钟就可以完全从一个服务器迁移到另一个服务器上。有了web2py,习惯于“租房”的草根站长们,再也没有“搬家”的烦恼了。

然而由于SAE本身具有的一些限制,目前的web2py还不能直接部署在SAE上,经过SAE工程师和网友们一段时间的努力之后也只能实现最简单的web2py应用在SAE上的部署,还不具备实用价值。

但是对于草根开发者而言,SAE的吸引力可以说是致命的。在云计算和移动互联网时代,一个不需要维护、速度快、高负载、低成本的服务器环境,对于一个Web应用或网站的快速成长具有重要的意义。SAE的出现使开发者将可以把主要精力放在产品设计、程序开发、产品运营和优化升级上,解决了开发者的后顾之忧。更何况,存储、邮件、短信、地理信息、中文分词等服务的使用,可以让Web应用或网站的能力大大提高,却几乎没有增加什么成本。

Bottle是一个单文件的Python Web开放框架,简洁、上手快、应用广泛,SAE支持Bottle是情理之中的事情。Bottle同样内置了一个轻量级Web服务器,本地的开发调试和web2py一样轻松。因此在SAE上进行开发,Bottle是一个不错的选择。

为什么要升级到v0.11

在明白了为什么要使用Bottle之后,接下来回答“为什么要升级到Bottle v0.11”。

Bottle v0.11目前还是开发版,但不久之后就会成为稳定版。SAE目前内置的Bottle是v0.9,这个版本至少有一个重要的不足,那就是URL映射的灵活性不够。

受web2py的影响,我习惯于把CSS文件、JS文件和图片分别放在static/css/、static/js/和static/img/目录下。

在Bottle v0.9中,为了实现对这些静态文件的应用,我需要这样写:

@app.route('/static/css/:filename')
def serve_css(filename):
    return static_file(filename , root='static/css')
@app.route('/static/js/:filename')
def serve_js(filename):
    return static_file(filename , root='static/js')
@app.route('/static/img/:filename')
def serve_img(filename):
    return static_file(filename , root='static/img')
@app.route('/static/doc/:filename')
def serve_doc(filename):
    return static_file(filename , root='static/doc')

 而在Bottle 0.11中(事实上从0.10开始就是这样),我只需要这样写:

@app.route('/static/')
def serve_static(filename):
    return static_file(filename , root='static')

可以看到v0.11相对于v0.9的改进具有很大的实用价值,因此需要升级到Bottle v0.11。

此外,因为不想很快又写重写本文,因此选择了开发中的v0.11而不是当前的稳定版v0.10。

让Bottle v0.11在SAE上运行

由于SAE对目录读写的限制,Bottle v0.11无法直接在SAE上运行,为了解决这个问题才有了这篇手记。

把车百科从Bottle v0.9升级到v0.11

准备工作

车百科是一个基于SAE和Bottle的简单应用,提供了汽车标志的和相关信息的快速查询,开发过程可以参考“车百科开发手记”。

在升级车百科之前,先备份源代码。我个人通常使用7z这种压缩格式,因为7z的压缩包中文件名都是以Unicode编码保存的,在Windows和Linux环境下切换时,中文文件名不会出现乱码。

升级开发期间,为了不影响现有应用的正常运行,需要新建SAE应用版本4:

$ git branch newbottle
$ git checkout newbottle
$ gvim config.yaml &
version: 4

Bottle Web开发框架的下载:

$ cd ~src/sae/che123
$ wget https://github.com/defnull/bottle/raw/master/bottle.py
$ git add .
$ git commit -m 'Upgrade Bottle to v0.11 which actually means 2012-04-03 dev.'
$ saecloud deploy
Deploying http://4.che123.sinaapp.com

发现问题,解决问题

升级到Bottle v0.11后,我们的应用会报错:

$ lynx http://4.che123.sinaapp.com
Traceback (most recent call last):
  File "/data1/www/htdocs/790/che123/4/index.wsgi" , line 2 , in
    from index import app
  File "/data1/www/htdocs/790/che123/4/index.py" , line 1 , in
    from bottle import Bottle , template , static_file , run
  File "/data1/www/htdocs/790/che123/4/bottle.py" , line 38 , in
    import base64 , cgi , email.utils , functools , hmac , imp , itertools , mimetypes ,\
  File "/usr/local/sae/python/lib/python2.6/subprocess.py" , line 416 , in
    import fcntl
ImportError: No module named fcntl

错误出在bottle.py文件的38行和39行的import subprocess上,因为subprocess需要fcntl这个模块,而SAE不支持。

Python官方文档中对fcntl模块的说明是:

This module performs file control and I/O control on file descriptors. It is an interface to the fcntl() and ioctl() Unix routines.

Python官方文档中对subprocess模块的说明是:

The subprocess module allows you to spawn new processes , connect to their input/output/error pipes , and obtain their return codes. This module intends to replace several other , older modules and functions , such as: os.system , os.popen.

而在bottle.py中实际使用subprocess的只有第2596行:

p = subprocess.Popen(args , env=environ)

注释掉下列行,并加上新的sys.exit():

sys.exit(0)
#p = subprocess.Popen(args , env=environ)
#while p.poll() is None: # Busy wait...
#    os.utime(lockfile , None) # I am alive!
#    time.sleep(interval)
#if p.poll() != 3:
#    if os.path.exists(lockfile): os.unlink(lockfile)
#    sys.exit(p.poll())

同时别忘了注释掉import subprocess。

$ git commit -am 'Modify bottle.py to comment subprocess.'
$ saecloud deploy
$ lynx http://4.che123.sinaapp.com/

访问正常,问题解决了。

如果你觉得本站对你有帮助,欢迎向本站赞助 :P

使用支付宝捐赠

Copyright© Python4cn(news, jobs) simple-is-better.com, 技术驱动:powered by web.py 空间主机:Webfaction

版权申明:文章转载已注明出处,如有疑问请来信咨询。本站为 python 语言推广公益网站,与 python 官方没有任何关系。

联系/投搞/留言: en.simple.is.better@gmail.com 向本站捐赠