在我的Google App Engine应用中,我收到错误
ImportError:没有名为main
的模块
转到网址/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.application
更改为main.py
或仅main
时,我收到同样的错误。为什么会出现此错误?
答案 0 :(得分:4)
您的配置正常 - 仅适用于main.py
中的小错误:您需要从application
模块访问main
名称,因此配置为:{{1 }}。这种改变应该可以解决问题:
main.application
不要担心 - application = webapp.WSGIApplication([('/foo', Handler)],
debug=False)
def main():
util.run_wsgi_app(application)
对象在创建时不会运行,也不会从此模块导入时,它只会在显式所有内容上运行,例如application
或在谷歌的内部架构中。
答案 1 :(得分: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
答案 2 :(得分:1)
正如documentation所说,
静态文件不能与应用程序代码文件相同。如果是静态的 文件路径匹配动态处理程序中使用的脚本的路径 脚本将不可用于动态处理程序。
在我的情况下,问题是该行
upload: .*
匹配我父目录中的所有文件,包括main.py.这意味着main.py不可用于动态处理程序。修复方法是将此行更改为仅识别此规则的URL行识别的相同文件:
upload: .*\.(html|css|js|gif|jpg|png|ico)