我正在尝试为将在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托管的正确选择吗?
感谢您的帮助和建议。
答案 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兼容。