2

我在使用 Firefox 12.0 和 GAE 上的 Python 处理程序时遇到了一些奇怪的行为。

当我在 Firefox 中请求此处理程序时,它会运行 3 次——但仅在它返回 GIF 时。

我目前正在通过基于处理程序的查询字符串设置一个内存缓存条目来解决它。我希望这将防止相同信息的重复 db.put()s。

这是一个有效的 URL:http ://test-o-tron.appspot.com——注意您可以更改这些查询字符串参数:

  • 格式(“gif”或“html”)
  • hack(“真”或“假”)
  • mkey_suffix(用于轻松重置计数器的内存缓存键中的字符串)

这是代码:

from google.appengine.api import urlfetch, memcache
from google.appengine.ext import db
import webapp2, random

class MainHandler(webapp2.RequestHandler):
    def get(self):

        #If user doesn't have an mkey_suffix, make one
        if self.request.get("mkey_suffix") == "":
            self.redirect("/?format=gif&hack=false&mkey_suffix=" + 
                          self.request.remote_addr + 
                          "." + str(random.randint(0, 1000)))


        OUTPUT_GIF = self.request.get("format") == "gif"
        USE_HACK = self.request.get("hack") == "true"

        #Memcache keys
        mkey_suffix = self.request.get("mkey_suffix")
        mkey_log = "log" + mkey_suffix
        mkey_hack = "hack" + mkey_suffix

        #Count the number of requests using memcache
        if memcache.get(mkey_log) is None:
            memcache.set(mkey_log, 0, 60)
        counter = memcache.get(mkey_log)

        #Hack!! Only handle a given request ONCE every second
        if not USE_HACK or memcache.get(mkey_hack) is None:
            memcache.set(mkey_hack, True, time=1)

            #Show I'm not crazy
            counter += 1
            memcache.set(mkey_log, counter, 60)

        #Return counter value 
        if OUTPUT_GIF:

            self.response.headers["Content-Type"] = "image/gif"
            img_url = "http://placehold.it/{counter}x{counter}"
            img_url = img_url.format(counter=str(400 + counter))
            img_data = urlfetch.Fetch(img_url).content
            content = db.Blob(img_data)


        else:

            #Output HTML 
            self.response.headers["Content-Type"] = "text/html"
            content = "Counter == " + str(counter)

        self.response.out.write(content)


app = webapp2.WSGIApplication([('/', MainHandler)], debug=True)
4

3 回答 3

1

您可以从您的请求日志中获取等效信息,而无需使用这种黑客手段。

您是否打算让您的应用服务动态 GIF?如果您的 GIF 是静态的,并且您在 中声明它们app.yaml,则处理程序将被完全绕过。可能仍然存在某种 Firefox 打嗝,但您的应用程序上的负载不会反映它。

请参阅https://developers.google.com/appengine/docs/python/gettingstarted/staticfiles

于 2012-05-18T04:13:29.657 回答
1

AppEngine 团队报告了以下错误:

调查关于 2013 年 6 月 13 日多次执行请求的 Google App Engine 问题的报告

我们正在调查有关 Google App Engine 问题的报告,在该问题中,请求可能会被多次执行。这在管理控制台日志中显示为对运行时间超过一分钟的前端的请求。我们将很快提供更多信息。

6 月 14 日,他们发布了以下更新:

我们已经确定了根本原因,并实施了修复,该修复将在接下来的几天内推出。您应该期望对正在运行的应用程序几乎没有持续影响。完成内部调查后,我们将对此问题进行更详细的分析。

于 2013-06-17T16:43:02.193 回答
0

你有什么问题?我敢打赌,这是某种 Firefox 行为,它正在请求一个网站图标或试图向前看或其他什么。

于 2012-05-18T16:47:15.150 回答