每个请求在 Appengine 上双击服务器
我在App Engine上有一个小应用。在我的本地开发服务器上,每次请求都会让服务器处理两次。
在调试模式下,我可以看到get方法被调用了两次。
这种情况在Chrome和Firefox浏览器中都发生。
INFO 2011-03-12 00:44:31,076 dev_appserver.py:3317] "GET /movie/tanu_weds_manu/rating-review-video HTTP/1.1" 200 -
INFO 2011-03-12 00:44:32,345 dev_appserver.py:3317] "GET /css/fb.css HTTP/1.1" 200 -
INFO 2011-03-12 00:44:32,588 dev_appserver.py:3317] "GET /css/wianga-movie.0.1.css HTTP/1.1" 200 -
INFO 2011-03-12 00:45:46,648 dev_appserver.py:3317] "GET /movie/tanu_weds_manu/rating-review-video HTTP/1.1" 200 -
INFO 2011-03-12 00:45:46,911 dev_appserver.py:3317] "GET /img/wianga-fb-50.gif HTTP/1.1" 200 -
INFO 2011-03-12 00:45:47,177 dev_appserver.py:3317] "GET /img/arrow_green.gif HTTP/1.1" 200 -
INFO 2011-03-12 00:45:47,470 dev_appserver.py:3317] "GET /image/movie/tanu_weds_manu HTTP/1.1" 200 -
INFO 2011-03-12 00:45:47,717 dev_appserver.py:3317] "GET /js/jquery.qtip-1.0.0-rc3.min.js HTTP/1.1" 200 -
INFO 2011-03-12 00:45:47,970 dev_appserver.py:3317] "GET /js/wianga.0.1.js HTTP/1.1" 200 -
INFO 2011-03-12 00:46:37,473 dev_appserver.py:3317] "GET /movie/tanu_weds_manu/rating-review-video HTTP/1.1" 200 -
更新: 情况变得更糟了,我查看了应用控制台的日志。那里显示每个请求被处理超过三次。
handlers:
- url: /favicon.ico
static_files: static/img/favicon.ico
upload: static/img/favicon.ico
- url: /robots.txt
static_files: static/robots.txt
upload: static/robots.txt
- url: /img
static_dir: static/img
- url: /images
static_dir: static/images
- url: /css
static_dir: static/css
- url: /js
static_dir: static/js
- url: /image/.*
script: /wianga/pages/common/ImageController.py
- url: /task/.*
script: /wianga/pages/task/TaskController.py
- url: /browse/.*
script: /wianga/site/Browse.py
- url: /movie/(.*)/rating-review-video/
script: /wianga/site/MoviePage.py
- url: /movie/(.*)/rating-review-video
script: /wianga/site/MoviePage.py
- url: /404
script: /wianga/404/404.py
- url: /api/.*
script: /wianga/api/ApiController.py
- url: /.*
script: /wianga/site/Home.py
在App Engine教程中的Hello World应用里,我也遇到了同样的问题...
App.yaml
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: helloworld.py
单个请求的Hello World示例日志...
INFO 2011-03-12 06:08:06,299 dev_appserver_main.py:507] Running application wianga-movie on port 8080: http://localhost:8080
INFO 2011-03-12 06:08:12,506 dev_appserver.py:3317] "GET / HTTP/1.1" 200 -
INFO 2011-03-12 06:08:13,721 dev_appserver.py:3317] "GET / HTTP/1.1" 200 -
INFO 2011-03-12 06:08:13,838 dev_appserver.py:3317] "GET /favicon.ico HTTP/1.1" 200 -
INFO 2011-03-12 06:08:13,953 dev_appserver.py:3317] "GET / HTTP/1.1" 200 -
1 个回答
当我设置我的app.yaml文件时,我仔细阅读了这个页面:http://code.google.com/appengine/docs/python/config/appconfig.html。你需要像正则表达式解析器那样思考。任何不符合之前定义的规则的请求都会被转发到你的通配符处理器,这样就可能出现一些奇怪的问题。
我注意到的一件事是,你应该在任务队列处理器中添加login: admin
。这样可以防止外部请求意外访问这个网址。
另外,当你向处理器提交任务时,如果不加上结尾的斜杠(比如用/task?blah=something
而不是/task/?blah=something
),请求就会被转发到你的通配符处理器,然后发送到Home.py。这种情况也可能发生在/image/
、/browse/
和/api/
上。你应该在这些处理器中加入日志记录,以确保它们在预期的时候被调用。
不过,我在你的app.yaml文件中没有看到明显错误的地方。但是,由于你的日志中出现了GET请求,这表明有东西在请求这个网址,而不仅仅是get
方法在内部被调用了两次。
编辑:
等一下,我刚注意到你在app.yaml中写了两次这个内容。其实不需要这样做。
- url: /movie/(.*)/rating-review-video/
script: /wianga/site/MoviePage.py
- url: /movie/(.*)/rating-review-video
script: /wianga/site/MoviePage.py`
试着替换成:
- url: /movie/(.*)/rating-review-video.*
script: /wianga/site/MoviePage.py`
编辑2:
试着在你的get
方法的顶部添加这个:
logging.info('environ: ' + str(self.request._environ))
把输出放到一个美化工具里(http://jsbeautifier.org/),这样更容易阅读。然后查看一下REQUEST_METHOD、QUERY_STRING、HTTP_USER_AGENT、HTTP_COOKIE、PATH_INFO和HTTP_REFERER这些参数,看看请求到底是从哪里来的。如果它们都是从你的浏览器发出的,那可能是你的html中有些奇怪的东西,比如隐藏的iframe(你在用Channel API吗?)。
另外,试着访问http://localhost:8080/_ah/admin/queues,确保没有旧任务在那儿挂着。