2014-01-08 43 views
5

我試圖設置本地環境,將GAE上的被託管如何使用Django 1.6與AppEngine上dev_appserver.py +不支持第三方庫

  • 我的第一個問題Django應用程序:我可以在app.yaml中不要求Django 1.6(不支持),所以我切換到「最新」版本,但我不知道我會通過這樣做得到什麼?

  • 我的第二個:我想使用一些額外的庫,如「django-taggit」。我在我的項目中創建了一個「libs」目錄,其中我複製了「taggit」目錄。我首先添加了PYTHONPATH的絕對路徑,然後我將它移動到了PATH,然後在sys.path.append中嘗試了wsgi.py,但是當我運行dev_appserver.py時,我一直有一個導入錯誤(ImportError:No module named taggit) ?

難道是我還是缺少關於我想做什麼的文檔?我花了很多時間搜索而沒有明確的結果。當你按照谷歌的方式使用webapp2時,一切似乎都是微不足道的,但當你不這樣做的時候更復雜。 GAE是Django託管的正確選擇嗎?

感謝您的幫助和建議。

+0

我已經在GAE上運行了一個Django應用程序,現在使用Google Cloud SQL作爲db數據庫,並且發現它運行得非常順利。 – Roger

+0

羅傑你可以請回答這個問題http://stackoverflow.com/questions/21002638/django-on-google-app-engine-with-cloud-sql-in-dev-environment – Sandeep

回答

3

相反,文檔對此很清楚。任何不是由SDK提供的第三方庫都需要安裝在您的應用程序目錄中。

dev服務器啓動自己的沙箱環境並忽略您現有的PYTHONPATH,並且無論如何您都無法更改生產環境中的sys.path。

+0

謝謝你節省我的時間。我讀過這篇文章,但是當文檔說「安裝在你的應用程序目錄中」時,我認爲必須在裏面,而不一定在根級別,如果你開始有幾個不是很「乾淨」的。所以它不可能移動到別的地方? – samidarko

+0

取決於你如何看待它。它非常乾淨,因爲它將所有上傳到生產服務器的所有內容從開發系統的其餘部分中分離出來。您可以將所有庫放在應用程序文件夾內的單獨libs文件夾中。看到這個答案:http://stackoverflow.com/questions/18248784/how-can-i-simply-modify-the-path-for-the-entire-requests-package-within-a-librar – dragonx

+0

我很確定你錯了。 –

6

在Google App Engine中一般可以使用任何庫,但是有必要考慮GAE有一些注意事項(即GAE不會以相同的方式管理文件結構,通常是代碼的某些部分用於做,在這種情況下,有必要使用博託和谷歌雲存儲和其他東西)。

目前GAE還沒有將Django 1.6作爲內置庫(第三方)使用,但GAE允許包含您自己的django版本,沒有限制。你需要在這最後一種情況下修改sys.path和app.yaml。在生產中sys.path的修改,可以例如在wsgi.py使用此代碼:

#wsgi.py ' Locate in main folder 
PROJECT_DIR = os.path.abspath(os.path.dirname(__file__)) 
PACKAGES_DIR = os.path.join(PROJECT_DIR, 'Lib', 'site-packages') 

def add_dir_to_path(dir): 
    if dir not in sys.path or sys.path.index(dir) > 0: 
     while dir in sys.path: 
      sys.path.remove(dir) 
     sys.path.insert(0, dir) 

add_dir_to_path(PROJECT_DIR) 
add_dir_to_path(PACKAGES_DIR) 

#Delete current django version in production 
for key in [key for key in sys.modules if key.startswith('django')]: 
    del sys.modules[key] 

os.environ["DJANGO_SETTINGS_MODULE"] = 'myapp.settings' 
from google.appengine.ext.webapp import util 
# Force Django to reload its settings. 
from django.conf import settings 
settings._target = None 

而且在app.yaml中您可以使用:

application: myappinGAE 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 

env_variables: 
    DJANGO_SETTINGS_MODULE: 'myapp.settings' 

handlers: 
- url: /.* 
    script: wsgi.application 

這種變化會說GAE到使用你自己的django版本,它位於/ Lib/site-packages/django。但是,我在使用django 1.6(數據庫身份驗證不起作用)時遇到了一些其他問題,但是對於init,此代碼將對您有所幫助,並且數據庫身份驗證對於Django 1.4或Django 1.5非常適用。

+0

沒有使用Google提供的「受支持」Django有什麼不利之處,而是使用了這裏概述的鍛鍊?鑑於谷歌現在提供了一個SQL後端,我不擔心有django-nonrel。 –

3

我相信改變路徑的正確方法是使用appengine_config.py文件,因爲它首先在應用程序中運行。 More info

現在這裏是我用於我的appengine應用程序的結構。

- /lib     # This is where all my 3rd party libs go 
- /myApp    # This is where my django app goes 
- /static    # Static Files 
- appengine_config.py # Initial configuration 
- app.yaml 

現在我appengine_config.py

import os 
import sys 
sys.path.insert(0,os.path.join(os.path.dirname(__file__), 'lib')) 
sys.path.insert(0,os.path.join(os.path.dirname(__file__), 'myApp')) 

而只是爲了它的緣故,這裏是我app.yaml

application: myApp 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: yes 

env_variables: 
    DJANGO_SETTINGS_MODULE: 'myApp.settings' 

handlers: 
- url: /static 
    static_dir: static 

builtins: 
- django_wsgi: on 

這種結構一直對我非常好。

但是我經常使用Django 1.4和1.5。我沒有使用Django 1.6的應用程序,所以我從來不必包含Django本身,我可以使用可用的庫。

0

添加Djangononrel也是可能的,但考慮到djangononrel正在發展並且是官方django的一個分支。檢查你要在你的django應用程序中使用的庫是否與這個fork兼容是必須的。

相關問題