【解决】SAE部署Django1.6+MySQL
终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好。
废话不多说,还是记录一下今天的工作吧。
1,装SVN
这个没什么好说的,去官网下下来,一路next装上而已,不过用SVN上传文件到SAE还是挺慢的,上传过程中我睡了一觉。
2,检出版本到本地
之前在SAE上尝试过部署,结果失败了,所以这次新开了版本,也就是版本2,用SVN检出到本地。
3,主要操作
从这里开始是重点!
刚检出版本2到本地的时候,2目录下只有config.yaml和index.wsgi两个文件,将本项目myenrich拷过来,注意目录结构,如图:
本地是这样的
首先忽略下图的db.sqlite3和sqlite3.exe,这俩是轻量级数据库,在SAE上用不着,那么上图的目录结构比下图多了两个文件夹:site-packages和static,为什么,下面来讲:
- site-packages
目前SAE支持Django的默认版本是1.2.7,1.4也支持,但我的项目是基于1.6.5的,所以这里会麻烦一点,要自己把Django1.6.5的包上传。
自己建一个site-packages文件夹,位置如上图,然后去python安装位置(例如C:\Python27\Lib\site-packages)把Django包拷贝过来。
然后修改config.yaml和index.wsgi,如下(基本上是俩文件的完整代码,之所以说基本上算,是因为我的文件里还有其他代码,但是我认为它没影响,不是注释就是不起作用的代码):
#-- config.yaml -- #
name: myenrich
version: 2
libraries:
-name: django
version: "1.6"
#-- index.wsgi --#
import os
import sys
root = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(root, '.', 'site-packages'))
import django.core.handlers.wsgi
import sae
os.environ['DJANGO_SETTINGS_MODULE'] = 'myenrich.settings'
application = sae.create_wsgi_app(django.core.handlers.wsgi.WSGIHandler())
注意:
首先,这里的代码要自己根据自己的情况来改,我这就和网上略不同,因为目录结构的关系,我的site-packages和index.wsgi等都 在一个目录层次,那么我的sys.path.insert就这么写,如果不是这样的层次,那就需要改sys.path.insert()函数中 os.path.join(roo, '*', 'site-packages')的"*"部分!这个灵活变动很重要,不然找不到路径的话啥都白搭。
另外,root和sys.path.insert做完之后才能import django,不然连django都找不到,import谁去。
最后,os.environ['DJANGO_SETTINGS_MODULE'] = ‘myenrich.settings’,这里的myenrich是自己的项目名,或许也跟目录结构有关,这点可以从图中看出。
其实我把2/myenrich/wsgi.py也改了,但不知道它起作用了没,贴代码吧
import os
import sys
root = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(root, '..', 'site-packages'))
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myenrich.settings")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)
做到这一步的话,应该是可以跑起来了,但是其他问题来了,虽然能跑起来,css和js却失效了,通过审查元素发现链接错了。
哦,对了,下午配置的时候出现找不到django.middleware.clickjacking的问题,我不明白这是干什么用的,所以我直接在2/myenrich/settings.py里把它注释掉了。
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
- static
之前在本地的时候没问题,SAE上找css和js的方法和本地不同么,反正按它的意思来改,所以我把static文件夹给提了出来,放在根目录下。
4,配置数据库
最后一步配置数据库,本地原来就是使用Django和MySQL的话这步问题其实不大。
用WAMP的phpMyAdmin进去把项目数据库导出成sql格式,有个插曲,WAMP一开始绿不了,原来是因为之前做项目的时候IIS开了,占用了80端口,把IIS关了就好了。
配置数据库只要是要改2/myenrich/settings.py文件!
A.把以下代码加到头部
import os.path
import sae.const
from os import environ
#debug = not environ.get("APP_NAME", "")
#if debug:
# MYSQL_DB = 'myenrich'
# MYSQL_USER = 'root'
# MYSQL_PASS = ''
# MYSQL_HOST_M = '127.0.0.1'
# MYSQL_HOST_S = '127.0.0.1'
# MYSQL_PORT = '3306'
#else:
#SAE
import sae.const
MYSQL_DB = sae.const.MYSQL_DB
MYSQL_USER = sae.const.MYSQL_USER
MYSQL_PASS = sae.const.MYSQL_PASS
MYSQL_HOST_M = sae.const.MYSQL_HOST
MYSQL_HOST_S = sae.const.MYSQL_HOST_S
MYSQL_PORT = sae.const.MYSQL_PORT
这里我直接就不让它调试了就```
B.修改DATABASES字段
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# 'ENGINE': 'django.db.backends.mysql',
# 'NAME': 'myenrich',
# 'USER': 'root',
# 'PASSWORD': '',
# 'HOST': '',
# 'PORT': '3306',
'ENGINE': 'django.db.backends.mysql',
'NAME': MYSQL_DB,
'USER': MYSQL_USER,
'PASSWORD': MYSQL_PASS,
'HOST': MYSQL_HOST_M,
'PORT': MYSQL_PORT,
}
}
前两行是之前用sqlite3的代码,中间的注释部分是本地用MySQL的方法,SAE用底下没注释的。
这里的NAME啊USER啊很明显用的是步骤A定义的变量,网上的教程居然有类似'NAME': 'MYSQL_DB'的写法,刚开始没注意吃亏了。
到这里代码就改完了,到SAE对应项目下的“服务管理”—“MySQL”—“管理MySQL”,把之前导出的sql文件导入进来就可以了。
-- 更新 2015-08-01
这里要注意,我用Django版本是1.8,其中默认建立的数据库中用到datetime是以datetime(6)这样的形式表示,而SAE上不支持datetime后跟括号,可能版本比较老。
因为我在本地phpMyAdmin导出sql脚本后要把datetime(6)改成datetime,这样才能顺利导入到SAE的mysql中。
用SVN同步修改,然后访问对应网址,应该就没有问题了。
配置过程很艰难,记录博客的时候不见得记得清每一步和犯下的所有错误,博客也只是一个参考而已,既然已经配出来了,我想最重要的还是配置过程中自己 的思考,而不是死板地按照网上的教程一步步下来,起码要知道它每一步的意义,要学会甄别并自己改正网上教程的错误,从迷雾中看见光芒。