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

sam*_*rko 5 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托管的正确选择吗?

感谢您的帮助和建议.

cas*_*rge 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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

这个变化将告诉GAE使用你自己的django版本,它位于/ Lib/site-packages/django中.但是,我在使用django 1.6时遇到了一些其他麻烦(数据库身份验证无法正常工作),但是对于init,这段代码可以帮助你,而且数据库身份验证适用于Django 1.4或Django 1.5.


Dan*_*man 3

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

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