SAE Python版与Django初体验
昨天新浪SAE的python平台正式对外开放。虽然很久以前我就作为测试用户得到了python平台的使用权,但是一直没去搞过这玩意儿。今天想起来,就拿来试试。
今天只是搞了一下最简单的东西,新建一个app,然后里面建个model,然后注册一个admin site,看它能跑就行了。
本地调试自然没什么问题,但是上传到SAE之后,还是有些问题要解决的。针对SAE新增的一些文件,比如config.yaml跟index.wsgi,在这里就不赘述了,根据新手指南来就行了。
DB问题
首先是DB的问题。SAE使用了MySQL做DB,并且这个MySQL连接不支持远程连接,SAE也没有地方去执行syncdb,所以只能是在本地做syncdb,然后dump出来一个sql文件,然后在SAE上面导入(SAE提供phpmyadmin做管理)。另外需要注意的是,SAE只支持MYISAM的引擎,而新版本的MySQL把InnoDB作为默认引擎了,如果用默认方式在本地做syncdb的话,产生的表都是InnoDB的。
综上,对settings.py作出如下修改:
IS_SAE = environ.get("APP_NAME","") if not IS_SAE: MYSQL_DB = 'sae_test' MYSQL_USER = 'root' MYSQL_PASS = 'root' MYSQL_HOST = '' MYSQL_PORT = '' else: import sae.const MYSQL_DB = sae.const.MYSQL_DB MYSQL_USER = sae.const.MYSQL_USER MYSQL_PASS = sae.const.MYSQL_PASS MYSQL_HOST = sae.const.MYSQL_HOST MYSQL_PORT = sae.const.MYSQL_PORT DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'OPTIONS' : { 'init_command' : 'SET storage_engine=MYISAM', }, 'NAME': MYSQL_DB, # Or path to database file if using sqlite3. 'USER': MYSQL_USER, # Not used with sqlite3. 'PASSWORD': MYSQL_PASS, # Not used with sqlite3. 'HOST': MYSQL_HOST, # Set to empty string for localhost. Not used with sqlite3. 'PORT': MYSQL_PORT, # Set to empty string for default. Not used with sqlite3. } }
前面根据是否SAE来配置数据库,可以让程序在本地和SAE上面都得到正确的MySQL配置。后面的DATABASES里面,特别使用了'OPTIONS' : { 'init_command' : 'SET storage_engine=MYISAM', },来强制使用MYISAM。这样再执行syncdb就能生成SAE可用的表了。
另外需要注意的是,dump应该用phpmyadmin来做(听起来很讽刺吧,做django开发,还得装个php),如果用MySQL Workbench的话,dump文件会含有类似
LOCK TABLES `django_admin_log` WRITE; /*!40000 ALTER TABLE `django_admin_log` DISABLE KEYS */; /*!40000 ALTER TABLE `django_admin_log` ENABLE KEYS */; UNLOCK TABLES;
这样的语句,会让SAE的DB无法执行。
另外一个比较搞的地方是,如果在startapp的时候,用了驼峰的命名方式,比如MySite,在syncdb的时候,在我的机器里生成了大小写错误的表名:mysite_xxxx。这大概是Mac OS X的文件系统大小写不敏感导致的吧。在OS X上面运行是完全没问题的,但是放到SAE上面,就会查询MySite_xxx的表,然后说找不到。所以app名称就不要用驼峰式的了。
admin site的static file问题
在本地开发的时候,我很少注意这个问题。因为django会自动搜索静态文件。但是在SAE里面,似乎不能自动找到admin site的静态文件。
首先修改settings.py,设置STATIC_ROOT='static/'
然后运行./manage.py collectstatic,就把静态文件都搞到工程目录下的static文件夹了。
然后修改config.yaml:
handlers: - url: /static static_dir: /static
(其实我发现config.yaml不改的话,SAE上面还是能找到静态文件的,但是新浪的官方指导说需要做,就做一下咯)
上面两个问题解决了,最基本的django程序就能在SAE上面跑了。上传的时候不要忘记修改工程文件夹的名字为‘1’.
本著作係採用創用 CC 姓名標示 2.0 通用版 授權條款授權.