NOTE: 目前SAE Python使用的版本是 Django-1.2.7 , 请确保你安装的是这个版本。
建立一个新的Python应用
假定app名字为pythondemo,在后续步骤中,你需针对你的app名字适当替换pythondemo。
检出SVN代码到本地目录
建立版本目录
jaime@westeros:~/source/chenfeng/pythondemo$ mkdir 1关于版本信息,请参与 SAE Python环境 环境信息节。
后续各种框架,都需要建立版本目录,不赘述。
新建文件index.wsgi,内容如下
import os
import django.core.handlers.wsgi
import sae
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
application = sae.create_wsgi_app(django.core.handlers.wsgi.WSGIHandler())
初始化django应用:
django-admin.py startproject mysite
从django安装目录复制admin 的media目录:
cp -rf django/contrib/admin/media/ .
目录结构如下:
jaime@westeros:~/source/chenfeng/pythondemo/1$ ls
index.wsgi media mysite README
jaime@westeros:~/source/chenfeng/pythondemo/1$ ls media/
css img js
jaime@westeros:~/source/chenfeng/pythondemo/1$ ls mysite/
demo __init__.py manage.py settings.py urls.py views.py
jaime@westeros:~/source/chenfeng/pythondemo/1$
提交代码
访问 http://$yourappname.sinaapp.com ,就可看到Django的欢迎页面了。
Hello, Django!
在mysite/目录下新建一个views.py,内容如下
from django.http import HttpResponse def hello(request): return HttpResponse("Hello, world! - Django")修改urls.py,新增一条规则解析hello,同时打开admin的注释:
# Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', ... (r'^$', 'mysite.views.hello), (r'^admin/', include(admin.site.urls)), )在setttings.py中开启admin组件:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', ... # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', )提交代码,访问 http://$yourappname.sinaapp.com/
Django 数据库配置见 支持服务列表 MySQL 节。
如果你定义了自己的templates目录,admin应用的模板可能无法使用,需要将admin的系统模块添加到settings.py中:
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
+ '/usr/local/sae/python/lib/python2.6/site-packages/django/contrib/admin/templates/admin',
os.path.join(PROJ_DIR, 'templates'),
)
FIXME: admin模块和自定义模块关系
index.wsgi
import sae
from myapp import app
application = sae.create_wsgi_app(app)
myapp.py
import MySQLdb
from flask import Flask, g, request
app = Flask(__name__)
app.debug = True
import sae.core
@app.before_request
def before_request():
appinfo = sae.core.Application()
g.db = MySQLdb.connect(appinfo.mysql_host, appinfo.mysql_user, appinfo.mysql_pass,
appinfo.mysql_db, port=int(appinfo.mysql_port))
@app.teardown_request
def teardown_request(exception):
if hasattr(g, 'db'): g.db.close()
@app.route('/')
def hello():
return "Hello, world! - Flask"
@app.route('/demo', methods=['GET', 'POST'])
def greeting():
html = ''
if request.method == 'POST':
c = g.db.cursor()
c.execute("insert into demo(text) values(%s)", (request.form['text']))
html += """
<form action="" method="post">
<div><textarea cols="40" name="text"></textarea></div>
<div><input type="submit" /></div>
</form>
"""
c = g.db.cursor()
c.execute('select * from demo')
msgs = list(c.fetchall())
msgs.reverse()
for row in msgs:
html += '<p>' + row[-1] + '</p>'
return html
index.wsgi
from bottle import Bottle, run
import sae
app = Bottle()
@app.route('/')
def hello():
return "Hello, world! - Bottle"
application = sae.create_wsgi_app(app)
index.wsgi
import tornado.wsgi
import sae
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world! - Tornado")
app = tornado.wsgi.WSGIApplication([
(r"/", MainHandler),
])
application = sae.create_wsgi_app(app)
Thanks to limodou At gmail.com
为搭建本地开发环境,你需要安装uliweb 0.0.1a7以上版本或svn中的版本, 简单的安装可以是:
easy_install Uliweb
安装后在Python环境下就可以使用uliweb命令行工具了。
目前Uliweb支持Python 2.6和2.7版本。3.X还不支持。
让我们从最简单的Hello, Uliweb的开发开始。首先假设你已经有了sae的帐号.
创建一个新的应用,并且选择Python环境。
从svn环境中checkout一个本地目录
进入命令行,切換到svn目录下
创建Uliweb项目:
uliweb makeproject project
会在当前目录下创建一个 project 的目录。这个目录可以是其它名字,不过它是和后面要使用的 index.wsgi 对应的,所以建议不要修改。
创建 index.wsgi 文件,Uliweb提供了一个命令来做这事:
uliweb support sae
这样会在当前目录下创建一个 index.wsgi 的文件和 lib 目录。注意执行时是在svn的目录,即project的父目录中。
index.wsgi 的内容是:
import sae
import sys, os
path = os.path.dirname(os.path.abspath(__file__))
project_path = os.path.join(path, 'project')
sys.path.insert(0, project_path)
sys.path.insert(0, os.path.join(path, 'lib'))
from uliweb.manage import make_application
app = make_application(project_dir=project_path)
application = sae.create_wsgi_app(app)
其中 project 和 lib 都已经加入到 sys.path 中了。所以建议使用上面 的路径,不然就要手工修改这个文件了。
然后就可以按正常的开发app的流程来创建app并写代码了,如:
cd project
uliweb makeapp simple_todo
这时一个最简单的Hello, Uliweb已经开发完毕了。
如果有静态文件,则需要放在版本目录下,Uliweb提供了命令可以提取安装的app的静态文件:
cd project
uliweb exportstatic ../static
如果有第三方源码包同时要上传到sae中怎么办,Uliweb提供了export命令可以导出已经 安装的app或指定的模块的源码到指定目录下:
cd project
uliweb export -d ../lib #这样是导出全部安装的app
uliweb export -d ../lib module1 module2 #这样是导出指定的模块
为什么还需要导出安装的app,因为有些app不是放在uliweb.contrib中的,比如第三方 的,所以需要导出后上传。但是因为export有可能导出已经内置于uliweb中的app,所以 通常你可能还需要在 lib 目录下手工删除一些不需要的模块。
提交代码
访问 http://<你的应用名称>.sinaapp.com ,就可看到项目的页面了。
Uliweb中内置了一个对sae支持的app,还在不断完善中,目前可以方便使用sae提供的MySql 数据库。
然后修改 project/apps/settings.ini 在 GLOBAL/INSTALLED_APPS 最后添加:
[GLOBAL]
INSTALLED_APPS = [
...
'uliweb.contrib.sae'
]
然后为了支持每个请求建立数据库连接的方式,还需要添加一个Middleware在settings.ini中:
[MIDDLEWARES]
transaction = 'uliweb.orm.middle_transaction.TransactionMiddle'
db_connection = 'uliweb.contrib.sae.middle_sae_orm.DBConnectionMiddle'
其中第一行是事务支持的Middleware你也可以选择使用。
这样就配置好了。而相关的数据库表的创建维护因为sae不能使用命令行,所以要按sae的 文档说明通过phpMyAdmin来导入。以后Uliweb会増加相应的维护页面来做这事。
index.wsgi
import os
import sae
import web
urls = (
'/', 'Hello'
)
app_root = os.path.dirname(__file__)
templates_root = os.path.join(app_root, 'templates')
render = web.template.render(templates_root)
class Hello:
def GET(self):
return render.hello()
app = web.application(urls, globals()).wsgifunc()
application = sae.create_wsgi_app(app)
带有模板支持的,完整示例代码
https://github.com/SAEPython/saepythondevguide/tree/master/examples/webpy