下面是一个最小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
我采取的步骤:
Datastore
和Memcache.
http://localhost:8080/set?name=x&value=88
。SetHandler
被调用两次(SetHandler:get!
被打印两次):$ 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
时,它只会被调用一次而不是两次?答案 0 :(得分:1)
我认为你有两个wsgi处理程序,一个在main,一个在app.yaml中声明 您不需要在main中调用run_wsgi_app,只需在全局范围内声明app变量,如下所示:
app = webapp.WSGIApplication([
('/get', GetHandler),
('/set', SetHandler)],
debug=False)
侧点:使用GET设置值是不好的做法,而是使用POST或PUT。