【解决】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:Python27Libsite-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同步修改,然后访问对应网址,应该就没有问题了。

配置过程很艰难,记录博客的时候不见得记得清每一步和犯下的所有错误,博客也只是一个参考而已,既然已经配出来了,我想最重要的还是配置过程中自己的思考,而不是死板地按照网上的教程一步步下来,起码要知道它每一步的意义,要学会甄别并自己改正网上教程的错误,从迷雾中看见光芒。

原文地址:https://www.cnblogs.com/raul-ac/p/4183400.html