App Engine后端配置(python)

时间:2014-02-13 15:42:02

标签: python google-app-engine backend task-queue

我的GAE服务器在尝试将大文件发送到EC2 REST服务器时出现timeout错误。我发现Backends Python API对我的示例来说是一个很好的解决方案,但我在配置时遇到了一些问题。

按照一些说明,我在项目文件夹中添加了一个简单的backends.yaml。但我仍然收到以下错误,似乎我无法创建后端实例。

  File "\Google\google_appengine\google\appengine\api\background_thread\background_thread.py", line 84, in start_new_background_thread
    raise ERROR_MAP[error.application_error](error.error_detail)
FrontendsNotSupported

以下是我的代码,我的问题是:

  1. 目前,OutputPage.py出现超时错误,如何让这个脚本在后端实例上运行?
  2. 更新

    根据Jimmy Kane的建议,我为后端实例创建了一个新脚本przm_batchmodel_backend.py。在盯着我的GAE后,现在我有两个端口(默认和后端)运行我的网站。这是对的吗?

    的app.yaml

    - url: /backend.html
      script: przm_batchmodel.py
    

    backends.yaml

    backends:
    - name: mybackend
      class: B1
      instances: 1
      options: dynamic
    

    OutputPage.py

    from przm import przm_batchmodel
    from google.appengine.api import background_thread
    
        class OutputPage(webapp.RequestHandler):
            def post(self):
                form = cgi.FieldStorage()
                thefile = form['upfile']
    
                #this is the old way to initiate calculations
                #html= przm_batchmodel.loop_html(thefile)  
    
                przm_batchoutput_backend.przmBatchOutputPageBackend(thefile)
    
                self.response.out.write(html)
        app = webapp.WSGIApplication([('/.*', OutputPage)], debug=True)
    

    przm_batchmodel.py

        def loop_html(thefile):
            #parses uploaded csv and send its info. to the REST server, the returned value is a html page. 
            data= csv.reader(thefile.file.read().splitlines())
            response = urlfetch.fetch(url=REST_server, payload=data, method=urlfetch.POST, headers=http_headers, deadline=60)   
            return response
    

    przm_batchmodel_backend.py

        class BakendHandler(webapp.RequestHandler):
            def post(self):
                t = background_thread.BackgroundThread(target=przm_batchmodel.loop_html, args=[thefile])
                t.start()
        app = webapp.WSGIApplication([('/backend.html', BakendHandler)], debug=True)
    

1 个答案:

答案 0 :(得分:1)

您需要为后端创建应用程序'文件'/脚本才能工作。就像你对主要做的一样。

类似于:

的app.yaml

- url: /backend.html
  script: przm_batchmodel.py

和przm_batchmodel.py

class BakendHandler(webapp.RequestHandler):
    def post(self):

        html = 'test'
        self.response.out.write(html)
app = webapp.WSGIApplication([('/backend.html', OutputPage)], debug=True)

我是否还建议您使用更易于设置的新功能modules

由于评论

修改

可能设置不是你的问题。

来自docs

  

在后端运行的代码可以启动后台线程,即一个线程   可以“生出”产生它的请求。它们允许后端实例   执行任意定期或计划任务或继续   请求返回给用户后在后台工作。

您只能在后端使用backgroundthread

再次编辑。移动代码的一部分:

 t = background_thread.BackgroundThread(target=przm_batchmodel.loop_html, args=[thefile])
 t.start()
 self.response.out.write(html)

到后端应用