2014-01-08 4 views
5

私はGAE上のAppEngine dev_appserver.pyでDjangoの1.6を使用する方法+サポートされていない第三のライブラリ

  • 私の最初の問題はホストされるDjangoアプリケーションのためのローカル環境を設定しようとしている:私はすることができますapp.yaml(サポートされていない)のDjango 1.6に尋ねるのではなく、私は「最新」のバージョンに切り替えましたが、これを行うことで何が得られるのか分かりません。

  • 私の2番目のもの: "django-taggit"のような余分なライブラリを使いたいです。私は私のプロジェクトで "taggit"ディレクトリをコピーした "libs"ディレクトリを作成しました。最初にPYTHONPATHへの絶対パスを追加してから、PATHに移動してからsys.path.appendでwsgi.pyを試してみましたが、dev_appserver.pyを実行しているときにインポートエラー(ImportError:モジュール名がtaggitではありません) ?

私は何をしたいのですか?私は明確な結果が得られずにグーグルで多くの時間を過ごしました。あなたがwebapp2でgoogleの方法に従うとすべてが些細なように思えるが、そうしないともっと複雑になる。 DjangoのホスティングにはGAEは正しい選択ですか?

ご協力いただきありがとうございます。

+0

Google Cloud SQLをDBとして9ヶ月間GAE上でDjangoアプリケーションを実行していて、かなり円滑に動作しています。 – Roger

+0

ロジャーはこの質問にお答えください。http://stackoverflow.com/questions/21002638/django-on-google-app-engine-with-cloud-sql-in-dev-environment – Sandeep

答えて

3

それどころか、これに関するドキュメントは非常に明確です。 SDKで提供されていないサードパーティのライブラリはすべて、アプリディレクトリにインストールする必要があります。

devサーバは独自のsandbox環境を起動し、既存のPYTHONPATHを無視します。したがって、本番環境ではsys.pathを変更することはできません。

+0

私の時間を保存してくれてありがとう。私はこれを読んだが、ドキュメントが「あなたのアプリディレクトリにインストールされている」と言ったとき、私は内部にある必要があり、ルートレベルではないと思っていました。だからどこか別の場所に移動することはできないのですか? – samidarko

+0

あなたはそれについてどのように考えますか?これは、実稼働サーバーにアップロードされているすべてのものを、開発システムの残りの部分から分離するので、きれいです。すべてのライブラリをappフォルダ内の別の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はファイル構造を通常は同じ方法で管理しません)この場合、botoとGoogleのクラウドストレージなどを使用する必要があります)。

現在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すると言うだろう/ Lib/site-packages/djangoにある独自のdjangoバージョンを使用してください。しかし、私はdjango 1.6(データベース認証は動作していません)でいくつかの問題を抱えていますが、initにはこのコードが役立ちます。データベース認証はDjango 1.4やDjango 1.5でもうまくいきます。

+0

Googleの「サポートされている」Djangoを使用していないという欠点はありますか? GoogleがSQLバックエンドを提供していることを考えると、私はdjango-nonrelを持つことに心配していません。 –

3

パスを変更する正しい方法は、アプリケーションで最初に実行されるため、appengine_config.pyファイルを使用することです。 More info

ここで私のappengineアプリに使用する構造は次のとおりです。私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')) 

そして、ちょうどそれのために今

- /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 

ここでこの構造は、私にとって非常によく働いてきた私の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でAppsを持っていないので、Django自体は含める必要がないので、代わりに使用可能なライブラリを使用できます。

0

Djangononrelを追加することも可能ですが、djangononrelが進化しており、公式のdjangoのフォークであることを考慮してください。 djangoアプリケーションで使用するライブラリがこのフォークと互換性があるかどうかを確認する必要があります。