3

在我的 Google App Engine 应用中,我收到了错误

ImportError:没有名为 main 的模块

访问 URL 时/foo。我的应用程序中的所有文件都在父目录中。

这是我的app.yaml

application: foobar
version: 1
runtime: python27
api_version: 1
threadsafe: no

handlers:

- url: /foo.*
  script: main.application

- url: /
  static_files: index.html

- url: /(.*\.(html|css|js|gif|jpg|png|ico))
  static_files: \1
  upload: .*
  expiration: "1d"

这是我的main.py

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

class Handler(webapp.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write('Hello world!') 

def main():
    application = webapp.WSGIApplication([('/foo', Handler)],
                                         debug=False)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

当我更改main.applicationmain.pyor时,我得到了同样的错误main。为什么会出现这个错误?

4

3 回答 3

4

您的配置没问题 - 只是在main.py: 您需要application从模块中访问名称的小错误main,因此配置是:main.application。这种改变应该可以解决问题:

application = webapp.WSGIApplication([('/foo', Handler)],
                                     debug=False)
def main():
    util.run_wsgi_app(application)

不用担心 -application对象不会在创建时运行,也不会在从该模块导入时运行,它只会在显式的 all 上运行,例如.run_wsgi_app或在 google 的内部架构中。

于 2013-06-24T00:15:10.407 回答
2

看看 python27 入门。你混合 CGI 和 WSGI。你必须在这里使用 webapp2。

你的 WSGI main.py :

import webapp2

class Handler(webapp2.RequestHandler):

    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write('Hello World!')


application = webapp2.WSGIApplication([
    ('/foo', Handler),
], debug=True)

另请参阅有关 CGI 和 WSGI 的博客文章:http: //blog.notdot.net/2011/10/Migrating-to-Python-2-7-part-1-Threadsafe

于 2013-06-23T23:50:25.820 回答
2

正如文件所说,

静态文件不能与应用程序代码文件相同。如果静态文件路径与动态处理程序中使用的脚本的路径匹配,则动态处理程序将无法使用该脚本。

就我而言,问题在于这条线

upload: .*

匹配我父目录中的所有文件,包括 main.py。这意味着 main.py 对动态处理程序不可用。修复方法是将此行更改为仅识别此规则的 URL 行识别的相同文件:

upload: .*\.(html|css|js|gif|jpg|png|ico)
于 2013-06-25T20:59:32.823 回答