最近几日学习了一下Bottle,这是一种用Python编写的轻量级的Web框架。类似的框架还有Flask,Tornado,Django,尽管后两者相对比较重量级。Bottle的文档简单清晰(http://bottlepy.org/docs/0.12/index.html),其中的“Todo-List Application”是一个很好的例子,在本机实现这个示例程序之后,我计划将其部署到真实的网站上,顺便也学习一下部署的过程(最后的成果见:http://simpletodo.applinzi.com/,很简陋,但主要是做为练手项目已经足够,Web框架的几个关键概念都练了一下)。
选择新浪云应用SAE(http://sae.sina.com.cn/)之后,发现实际的部署过程又是一个需要不断学习、思考、尝试、总结的艰辛过程。新浪的文档有些散乱,SAE本身也有不少坑,在此整理一下部署步骤和绕坑方法,供大家参考:
应注意避开的坑:
1、新浪SAE支持的Python版本是2.7,所以请提前调整好本地环境
2、数据库方面,SAE不支持python自带的sqlite3。可以考虑采用MySQL,并使用新浪SAE的数据库服务,详见https://www.sinacloud.com/doc/sae/php/mysql.html。
3、SAE中的Bottle采用的是0.9或更早版本,不支持route中的过滤器功能。所以对于正则表达式等请考虑使用老版本。(也有文档指出,可以升级SAE的依赖库的,PosPro没有做测试,列出来供参考:http://simple-is-better.com/news/834)
4、新浪SAE的本地开发环境sae-python-dev似乎在virtualenv下无法使用,可以考虑直接全局安装(此点不确定,也可能是我的配置存在问题)
调试和部署步骤
S1、在本地写好程序并调试通过
S2、参照SAE的要求(http://www.sinacloud.com/doc/sae/python/tutorial.html#hello-world),建立config.yaml文件,其实就两句:
name:应用名(应该与将来在SAE上建立应用的名称相同) version: 1
S3、建立index.wsgi文件,针对不同的WEB框架(Bottle?Web.py? Flask ?),文档(http://www.sinacloud.com/doc/sae/python/tutorial.html#hello-world)中有不同要求。对于Bottle来说,核心也就两句话:
import sae ... ... application = sae.create_wsgi_app(app)
S4、完成以上几步之后,你的程序就基本可以上线了,可以选择直接上传至SAE(具体方法见S6),实际测试功能。
(S5、建立本地测试环境进行测试,本步骤为可选步骤。)
(S5.1)、通过pip install sae-python-dev安装本地测试环境,建议全局安装而不是在virtualenv下安装。按照完成后,就可以通dev_server.py来对程序进行本地测试。(详见:http://www.sinacloud.com/doc/sae/python/tools.html#ben-di-kai-fa-huan-jing)
(S5.2)如果使用MySQL,还需要安装MySQLdb(以便import MySQLdb)。在Windows环境下,可以下载MySQL-python(https://pypi.python.org/pypi/MySQL-python/1.2.5)
(S5.3)如果想在本地真正完成包括数据库读写方面的测试,还得安装MySQL主程序。在这里要注意由于MySQLdb兼容性的问题,MySQL只能选择MySQL-3.23~5.5(地址:http://dev.mysql.com/downloads/mysql/5.5.html#downloads)
(注:如果按照S5.3步骤在本地按照MySQL数据库,其数据库命名恐怕也要按照SAE的规定,本人未做此步,写出来仅供参考。其实,如果不觉得反复上传是一种麻烦的话,S5步骤都可以省略。直接上传SAE之后,也是可以测试和分析的。最后需要说明的是SAE自己也在文档中指出,本地开发环境的功能并不完善。)
S6 向SAE上传程序,具体步骤可参考(http://www.sinacloud.com/doc/sae/python/tutorial.html#hello-world),也可按照我下面梳理的步骤来:
S6.1 如果你的机器上没有安装过git程序的话,先安装一个(PosPro用的是Git-2.7.0-32-bit)
S6.2 学习git的基本使用,一个比较详细的教程(http://blog.jobbole.com/78960/),比较关键的几个命令列举如下:
git init —— 把当前目录设置成git管理的仓库 git add XXX(文件名)——把文件添加到暂存区里面去 git add . ——把当前目录的所有文件都添加进去 git remote add sae https://git.sinacloud.com/应用地址——连接SAE上的具体应用 git commit——把文件提交到仓库 git push master:数字(版本号)——上传某一版本的数据 git pull sae :Version —— 下载数据避免每次push都输入密码的繁琐,可以在执行push之后加一句:
S6.3 利用Git向SAE上传数据, 详细参见http://www.sinacloud.com/doc/sae/tutorial/code-deploy.html#git
S7 在SAE上建立配套数据库
S7.1 针对具体应用,进入“管理应用”页面,在页面左侧的导航栏中,找到“数据库服务——共享型MySQL”,在这里就可以管理和创建自己的MySQL数据库表了
S7.2 SAE提供的这个管理界面虽然简陋,但还是比较方便的,可以选择自己建表,也可以导入数据,详见文档(http://www.sinacloud.com/doc/sae/services/mysql.html)
S7.3 如果您和我一样计划用MySQLdb来做连接的话,下面的例子可供参考:
##下面是SAE对数据库变量的定义 #sae.const.MYSQL_DB # 数据库名 #sae.const.MYSQL_USER # 用户名 #sae.const.MYSQL_PASS # 密码 #sae.const.MYSQL_HOST # 主库域名(可读写) #sae.const.MYSQL_PORT # 端口,类型为<type 'str'>,请根据框架要求自行转换为int #sae.const.MYSQL_HOST_S # 从库域名(只读) ##利用MySQLdb连接的实例 import MySQLdb db = MySQLdb.connect(port=int(sae.const.MYSQL_PORT), host=sae.const.MYSQL_HOST, db=sae.const.MYSQL_DB, user=sae.const.MYSQL_USER, passwd=sae.const.MYSQL_PASS)
S8 反复测试吧
PosPro最后的成果见:http://simpletodo.applinzi.com/,很简陋,但主要是做为练手项目已经足够,Web框架的几个关键概念都练了一下。