我有以下app.yaml文件
application: gtryapp
version: 1
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /images/(.*\.(gif|png|jpg))
static_files: static/img/\1
upload: static/img/(.*\.(gif|png|jpg))
- url: /css/(.*\.css)
mime_type: text/css
static_files: static/css/\1
upload: static/css/(.*\.css)
- url: /js/(.*\.js)
mime_type: text/javascript
static_files: static/js/\1
upload: static/js/(.*\.js)
- url: /(.*\.html)
mime_type: text/html
static_files: static/\1
upload: static/(.*\.html)
- url: .*
script: main.app
libraries:
- name: webapp2
version: "2.5.2"
文件app.py:
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
if self.request.url.endswith('/'):
path = '%sindex.html'%self.request.url
else:
path = '%s/index.html'%self.request.url
self.redirect(path)
application = webapp2.WSGIApplication([('/.*', MainPage)],
debug=True)
我应该部署的文件只是html文件或js或图像,编译应用程序后出现以下错误:
引发ImportError('%s没有属性%s'%(处理程序,名称)) ImportError:没有属性应用
解决:我不得不称“app”而非“应用程序”!
app = webapp2.WSGIApplication([('/.*', MainPage)],
debug=True)
答案 0 :(得分:6)
你已经调用了index.py文件,而不是main.py.重命名,或在yaml中使用index.app
。
答案 1 :(得分:2)
您遇到的问题是您的app.yaml
文件无法正确描述您的代码。这是令人讨厌的一点:
- url: .*
script: main.app
这表示所有与先前条目不匹配的URL应由app
模块的main
对象处理,该对象应该是WSGI应用程序对象(请参阅WSGI标准)。
这不起作用,因为您的代码设置不同。您的主要模块位于index.py
(index
模块)中,其与服务器的接口是通过CGI标准(尽管WSGI在内部使用)。
所以,你需要改变一些东西。它可以是应用程序的app.yaml
描述,也可以是代码的组织。
使您的代码作为CGI风格的程序工作很容易。只需将app.yaml
更改为指向index.py
作为脚本即可。在这种情况下,.py
部分是文件扩展名,文件将作为脚本运行。
如果您想使用更新的WSGI兼容样式(这可能是最佳选择),the documentation建议使用以下格式:
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
app = webapp2.WSGIApplication([('/', MainPage)])
你的代码已经差不多了。要使其工作,请删除main
函数和if __name__ == "__main__"
样板。替换为:
app = webapp.WSGIApplication([('/.*', IndexHandler)],
debug=False)
这会在模块的顶层创建一个app
对象。现在,将index.py
文件重命名为main.py
,或将app.yaml
更改为index.app
。这次的.app
部分不同。它代表Python成员访问(在这种情况下,访问模块中的全局变量)而不是文件扩展名。