我不断收到一条错误消息,提示没有名为backend
的模块,这是我的webapp2应用程序所在的目录。
我的文件夹结构:
/project
/backend
/env #python virtual env libraries
main.py #my main entry point where webapp2 app instance is
requirements.txt
app.yaml
我的app.yaml:
service: default
handlers:
- url: /dist
static_dir: dist
- url: /.*
script: backend.main.app
libraries:
- name: webapp2
version: latest
- name: jinja2
version: latest
在我的app.yaml
进入后端之前,但我决定转向root。现在,当我以root身份运行dev_appserver.py
时,我会不断得到ImportError: No module named backend
我创建了virualenv,并在backend
目录中安装了requirements.txt软件包。
编辑:我不确定这是否有所不同,但是当app.yaml
位于backend
文件夹中时,我已经部署了应用程序。我猜这应该没关系,因为我试图通过在项目根目录中移动app.yaml
并运行dev_appserver.py app.yaml
在本地进行测试,但是当我这样做时似乎不起作用。
答案 0 :(得分:2)
包含GAE服务的app.yaml
文件的目录是该服务的顶级目录。该目录的内容是在部署服务时将上载到GAE的内容。服务的代码或配置中引用的所有路径都与此顶级目录有关。因此,在移动app.yaml
文件而不更新相关代码和配置的情况下,会破坏该应用程序的功能。
您似乎不太了解script:
语句的含义。来自Handlers element:
script:
指令必须是python导入路径,例如,package.module.app
指向WSGI应用程序。最后 使用Python模块路径的script:
指令的组成部分是 模块中全局变量的名称:该变量必须是WSGI 应用,通常习惯上称为app
。注意:就像Python导入语句一样,每个子目录 是一个程序包,必须包含名为
的文件__init__.py
因此,假设您的app.yaml
文件位于您的project
目录中,则
script: backend.pythonAttack.app
表示:
__init__.py
目录中有一个backend
文件,以将backend
打包为一个包pythonAttack.py
目录中有一个backend
文件,其中一个app
变量指向您的webapp2应用程序根据您的描述,您不满足以下任何条件。
我的建议:
app.yaml
保留在backend
目录(不需要是python软件包目录)中更新其script
行以匹配您的代码。假设您的app
应用的webapp2
变量实际上在main.py
文件中,则该行为:
script: main.app
通过显式传递app.yaml
文件作为参数在本地运行应用程序(通常是一个好习惯,也是运行具有多种服务和/或dispatch.yaml
文件的应用程序的唯一方法) :
dev_appserver.py backend/app.yaml
将您的服务python依赖项存储在backend/lib
目录中(遵循命名约定),与您的virtualenv软件包分开
env
virtualenv程序包目录存储在backend
目录之外,以防止在部署服务时不必要地将它们上载到GAE(并可能干扰应用程序的操作)。 virtualenv的目标是在本地正确模拟GAE沙箱,以便您可以正确运行开发服务器。构建多服务应用时可能会感兴趣:Can a default service/module in a Google App Engine app be a sibling of a non-default one in terms of folder structure?