GAE Python ImportError:没有模块 - 在本地工作但不在云端工作

时间:2013-01-27 07:52:50

标签: google-app-engine python-2.7 importerror

这适用于本地开发。但是,当我部署到生产时,我遇到了问题。我收到的错误如下:

Traceback (most recent call last):
File "/python27_runtime/python27_lib/versions/1/google/appengine/runtime/wsgi.py", 
line 196, in Handle
handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
File "/python27_runtime/python27_lib/versions/1/google/appengine/runtime/wsgi.py", 
line 255, in _LoadHandler
handler = __import__(path[0]) ImportError: No module named shamn

这是我的app.yaml文件供参考:

application: shaman-labz
version: 1-4
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /css
  static_dir: css

- url: /s
  static_dir: s

- url: /api.*
  script: shamn.app

- url: /.*
  script: helloworld.app

libraries:
- name: jinja2
  version: latest

我已经尝试了所有我能想到的东西来仔细检查任何潜在的命名冲突。 helloworld.app适用于本地和云,但/ api.*显然正确映射到shamn.app,但由于某种原因没有看到'shamn'。我检查并三次检查shamn.py是否存在于根目录(与app.yaml和helloworld.py相同的目录)中。我重命名为shamn.py,因为之前我有一个名为shaman的静态目录,我认为可能会导致云中的冲突。我甚至试过改变1.3版本的版本 - > 1.4确保一切都干净...等...仍然无法弄清楚为什么会发生这种情况...请注意,在流程的每一步,我都会在推送到云之前验证本地开发环境中的功能。因为这纯粹是一个服务器端问题,我不打算清除客户端上的任何缓存,但我可以从日志中看到请求到达正确的URL(/ api / test,/ api?,/ api) / etc(以及所有其他合理的组合以防万一)。不起作用... arrrggg。我做错了什么?

供参考,这是我非常简单的测试shamn.py(我将再试一次并重命名) [更新 - 只是删除任何未知数,我从等式中删除了json ......

import jinja2
import os
#import json

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))


import webapp2


class MainPage(webapp2.RequestHandler):
    def get(self):

        template_values = {
            'greetings': [],
            'url': 'url',  
            'url_linktext': 'url_linktext'
        }
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(template_values))

class testclass(webapp2.RequestHandler):
    def get(self):
        self.response.out.write('hello world from testclass.get')
    def post(self):
        #jsonobj = json.loads(self.request.body)
        #self.response.out.write(json.dumps(jsonobj))
        self.response.out.write(self.request.body)

app = webapp2.WSGIApplication([
        ('/api/test.*', testclass),
        ('/api.*', MainPage)                            
  ],debug=True)

这适用于dev,但不适用于生产。 并且,'index.html'被验证存在(与helloworld.app共享)所以我想我可以排除这一点)。请注意,我已经和GAE一起工作了很多年,而且我从来没有这么难过,而且看起来很简单。我不得不破解我所有的基本代码,现在我又回到了代码的一堆......离线工作两周而不是推向云端的缺点之一(这可能是早先发现的)。

任何帮助将不胜感激。

...更新,嗯,这是第二天早上,我仍然难倒......接下来我要做的就是创建一个新文件。我想要完成的就是使用简化的xmlhttprequest将一些json从客户端发布到服务器。这不应该是跨域问题,因为页面是从同一个域加载的。此外,请求已经足够远,至少认识到shamn(一个python模块)应该存在,但它找不到它。这已经重命名了一次,所以我只是'修补',看看我是如何找到解决方案的。主要问题是每次我尝试更改代码都要求我重新上传到云端,因为我无法在dev中复制。

2 个答案:

答案 0 :(得分:0)

检查该文件是否被称为Shamn.py,因为AppEngine在生产服务器上区分大小写。

答案 1 :(得分:0)

这是一个老问题,答案是wsgi.app处于全局上下文中,这意味着不能有两个。我在每个shamn.py和helloworld.py中都有一个(都叫app),导致冲突。摆脱了helloworld,一切正常。