2

Firefox 12.0 と GAE の Python ハンドラーで奇妙な動作が発生しています。

Firefox でこのハンドラーを要求すると、3 回実行されますが、GIF を返す場合のみです。

現在、ハンドラーのクエリ文字列に基づいて memcache エントリを設定することでハッキングしています。これにより、同じ情報の重複した db.put() が防止されることを願っています。

有効な URL は次のとおりです: http://test-o-tron.appspot.com -- これらのクエリ文字列パラメーターは変更できることに注意してください。

  • 形式 (「gif」または「html」)
  • ハック (「真」または「偽」)
  • mkey_suffix (カウンターを簡単にリセットするために memcache キーで使用される文字列)

コードは次のとおりです。

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 の問題のレポートを調査しています。これは、1 分以上実行されるフロントエンドへの要求として管理コンソール ログに表示されます。詳細については、近日中にお知らせします。

6 月 14 日に、次の更新プログラムを発行しました。

根本的な原因を特定し、修正を実装しました。これは、今後数日かけて展開される予定です。実行中のアプリケーションへの継続的な影響はほとんどまたはまったくないと予想する必要があります。内部調査が完了したら、この問題のより詳細な分析を提供します。

于 2013-06-17T16:43:02.193 に答える
0

あなたの質問は何ですか?これは、ファビコンを要求したり、先を見越そうとしたりするFirefoxの動作の一種だと思います。

于 2012-05-18T16:47:15.150 に答える