【解決】SAE部署Django1.6+MySQL

終於能夠舒口氣了,今天大部分時間都在搞這個,非常蛋疼,網上資料參差不齊,我不信這個以前沒人作過,可是他們確實分享的不夠好。php

廢話很少說,仍是記錄一下今天的工做吧。css

 

1,裝SVNpython

這個沒什麼好說的,去官網下下來,一路next裝上而已,不過用SVN上傳文件到SAE仍是挺慢的,上傳過程當中我睡了一覺。mysql

2,檢出版本到本地sql

以前在SAE上嘗試過部署,結果失敗了,因此此次新開了版本,也就是版本2,用SVN檢出到本地。數據庫

3,主要操做django

從這裏開始是重點!session

剛檢出版本2到本地的時候,2目錄下只有config.yaml和index.wsgi兩個文件,將本項目myenrich拷過來,注意目錄結構,如圖:app

本地是這樣的函數

首先忽略下圖的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同步修改,而後訪問對應網址,應該就沒有問題了。

 

配置過程很艱難,記錄博客的時候不見得記得清每一步和犯下的全部錯誤,博客也只是一個參考而已,既然已經配出來了,我想最重要的仍是配置過程當中本身的思考,而不是死板地按照網上的教程一步步下來,起碼要知道它每一步的意義,要學會甄別並本身改正網上教程的錯誤,從迷霧中看見光芒。

相關文章
相關標籤/搜索