如何使用Django 1.6与appengine dev_appserver.py +不支持第三个库

时间:2014-01-08 09:48:15

标签: django google-app-engine

我正在尝试为将在GAE上托管的Django应用设置本地环境

  • 我的第一个问题:我不能在app.yaml中询问Django 1.6(不支持)所以我切换到“最新”版本,但我不确定这样做会得到什么?

  • 我的第二个:我想使用一些额外的库,例如“django-taggit”。我在项目中创建了一个“libs”目录,我复制了“taggit”目录。我首先添加了PYTHONPATH的绝对路径,然后我将它移动到PATH,然后在wsgi.py中尝试使用sys.path.append,但是当我运行dev_appserver.py时,我一直有导入错误(ImportError:没有名为taggit的模块)

是我还是缺少关于我想做什么的文件?我花了很多时间谷歌搜索没有明确的结果。当您使用webapp2遵循谷歌方式时,一切似乎微不足道,但如果不遵循谷歌方式则更加复杂。 GAE是Django托管的正确选择吗?

感谢您的帮助和建议。

4 个答案:

答案 0 :(得分:6)

通常可以在Google App Engine中使用您想要的任何库,但是有必要考虑GAE有一些注意事项(即GAE不会以相同的方式管理文件结构,通常是代码的某些部分使用要做,在这种情况下,有必要使用boto和谷歌云存储和其他东西)。

目前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也有效。

答案 1 :(得分:3)

相反,文档对此非常清楚。 SDK未提供的任何第三方库都需要安装在您的app目录中。

开发服务器启动自己的沙箱环境并忽略现有的PYTHONPATH,无论如何都无法在生产环境中更改sys.path。

答案 2 :(得分: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,我可以使用可用的库。

答案 3 :(得分:0)

添加Djangononrel也是可能的,但考虑到djangononrel正在发展并且是官方django的分支。有必要检查您将在django应用程序中使用的库是否与此fork兼容。