SAE Python版与Django初体验

hikui posted @ 2013年3月01日 15:49 in python , 3576 阅读

昨天新浪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 授權條款
本著作係採用創用 CC 姓名標示 2.0 通用版 授權條款授權.

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter