首次调用GAE SetHandler时,会调用两次而不是一次

时间:2016-10-22 10:19:23

标签: python google-app-engine

下面是一个最小Python示例,显示向NDB添加一个实体,但实际上被调用两次(实体出现)在Datastore Viewer和调试行中两次。

代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

class GetHandler(webapp.RequestHandler):
    def get(self):
        print "GetHandler:get!"

class SetHandler(webapp.RequestHandler):
    def get(self):
        print 'SetHandler:get!'

def main():
    print 'main!'
    application = webapp.WSGIApplication([
            ('/get', GetHandler),
            ('/set', SetHandler)],
            debug=False) 
    global app
    app = application
    run_wsgi_app(app)

if __name__ == 'main':
    main()

的app.yaml:

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: main.app

我采取的步骤:

  1. 我从已清除的DatastoreMemcache.
  2. 开始
  3. 我在浏览器中输入http://localhost:8080/set?name=x&value=88
  4. 如调试行中所示,SetHandler被调用两次(SetHandler:get!被打印两次):
  5. $ dev_appserver.py .
    INFO     2016-10-22 09:55:35,298 devappserver2.py:769] Skipping SDK update check.
    INFO     2016-10-22 09:55:35,389 api_server.py:205] Starting API server at: http://localhost:32980
    INFO     2016-10-22 09:55:35,395 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
    INFO     2016-10-22 09:55:35,395 admin_server.py:116] Starting admin server at: http://localhost:8000
    main!
    SetHandler:get!
    Status: 200 OK
    Content-Type: text/html; charset=utf-8
    Content-Length: 0
    Cache-Control: no-cache
    
    SetHandler:get!
    INFO     2016-10-22 09:56:41,585 module.py:788] default: "GET /set?name=x&value=88 HTTP/1.1" 200 -
    

    注意:上述情况仅在SetHandler.的第一次调用时发生。所有后续SetHandler调用的行为与预期相同(即,调用一次 - 执行一次)。

    我是否可以更改某些内容,以便在第一次调用SetHandler时,它只会被调用一次而不是两次?

1 个答案:

答案 0 :(得分:1)

我认为你有两个wsgi处理程序,一个在main,一个在app.yaml中声明 您不需要在main中调用run_wsgi_app,只需在全局范围内声明app变量,如下所示:

app = webapp.WSGIApplication([
            ('/get', GetHandler),
            ('/set', SetHandler)],
            debug=False) 

侧点:使用GET设置值是不好的做法,而是使用POST或PUT。