終於能夠舒口氣了,今天大部分時間都在搞這個,非常蛋疼,網上資料參差不齊,我不信這個以前沒人作過,可是他們確實分享的不夠好。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,爲何,下面來說:
目前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', )
以前在本地的時候沒問題,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同步修改,而後訪問對應網址,應該就沒有問題了。
配置過程很艱難,記錄博客的時候不見得記得清每一步和犯下的全部錯誤,博客也只是一個參考而已,既然已經配出來了,我想最重要的仍是配置過程當中本身的思考,而不是死板地按照網上的教程一步步下來,起碼要知道它每一步的意義,要學會甄別並本身改正網上教程的錯誤,從迷霧中看見光芒。