Hatena::Grouprubyist

たばさの RSSフィード

05/17(日) 2009

urlfetchとmemcacheを使ってみるテスト

| urlfetchとmemcacheを使ってみるテスト - たばさの を含むブックマーク はてなブックマーク - urlfetchとmemcacheを使ってみるテスト - たばさの

カウンタととりあえずhtmlまるごととヘッダーを表示。

不特定多数がアクセスしてもcacheのデータが使われる。と思っていいんでしょうか。

f:id:hatecha:20090517045440j:image

f:id:hatecha:20090517045441j:image

memcachetes.py

#!python
# -*- coding: utf-8 -*-
# cf.
# d.hatena.ne.jp/technohippy/20080717
# code.google.com/appengine/docs/memcache/

import os
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import db,webapp
from google.appengine.ext.webapp import template
from google.appengine.api import memcache,urlfetch 
import urllib

def existcache(key):
  data=memcache.get(key)
  if data == None:
    return False
  else:
    return True

def get_data(key):
  data = memcache.get(key)
  if data is not None:
    return data
  else:
    data = 0
    memcache.add(key, data, 60)
    return data

def guess_charset(data): 
   """www.freia.jp/taka/blog/571""" 
   f = lambda d, enc: d.decode(enc) and enc  
  
   try: return f(data, 'utf-8')  
   except: pass  
   try: return f(data, 'shift-jis')  
   except: pass  
   try: return f(data, 'euc-jp')  
   except: pass  
   try: return f(data, 'iso2022-jp')  
   except: pass  
   return None  
  
def conv(data,e):  
   charset = guess_charset(data)  
   u = data.decode(charset)  
   return u.encode(e)


class SubPage(webapp.RequestHandler):
  def get(self,match):
    url=urllib.unquote(match)
    lasturl =memcache.get("url")
    reset=False
    if reset or (existcache("url") ==False) or (url !=lasturl) or (existcache("content") ==False):
      result = urlfetch.fetch(url)
      enc=guess_charset(result.content)
      tmp=unicode(result.content,enc).encode("utf_8")
      if result.status_code == 200:
        memcache.set(key="url", value=url, time=900)
        memcache.set(key="content", value=tmp+"(cache)", time=900)
        memcache.set("counter",0)
    content=memcache.get("content")
    memcache.incr("counter")
    c=memcache.get("counter")
    template_values = {
      "counter":c,
      "url":content+url
    }
    tmpl = os.path.join(os.path.dirname(__file__), 'mem.htm')
    self.response.out.write(template.render(tmpl, template_values))

class MainPage(webapp.RequestHandler):
  def get(self):
    url="http://d.hatena.ne.jp/hatecha/"
    self.redirect('/my/memcache/'+url)

def main():
    application = webapp.WSGIApplication([('/my/memcache', MainPage),
                                         ('/my/memcache/(.+)', SubPage)
                                         ], debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
    main()

mem.htm

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
  <dev>{{counter}}</dev>
  <dev>{{content}}</dev>
  <dev>{{fetch_header}}</dev>
</body>
</html>

app.yaml

application: app-id
version: 1
runtime: python
api_version: 1

handlers:
- url: /my/memcache
  script: memcachetes.py
- url: /my/memcache/(.*)
  script: memcachetes.py

いろいろ手抜き

MainPage,SubPageはたぶんredirectするんだと思うけどとりあえず。(した)

http://tabasano0001.appspot.com/my/memcache/http://{ なにか }

でアクセス。


remote cache hitというのは、urlfetchのcacheを使ってるってことか.

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20090517
カレンダー
<< 2009/05 >>
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
archive Error : RSSが取得できませんでした。