本文を読み飛ばす

GAE/pyで懐かしのwebカウンタを作ってみる

djangoでカウンタを作ってみます.

  • django 1.2(最新は1.5です)

  • 初期値が変えられる

  • blacklistが作れる

  • 大量のアクセスが来るようなサイトには使わないこと、

    いきなり課金になってもしらないですよ()

プロジェクトの作り方

以前の記事、もしくはチュートリアルを参考にする

djangoプロジェクト

以前の記事、もしくはチュートリアルを参考にする

今はdjango-relなどもあるのか...? よく調べてません.

models.py = DataBaseの定義

カウンタ用に以下のようなmodelを作ります.:

class WebPageCount(db.Model):
  name = db.StringProperty(required=True)
  count = db.IntegerProperty(required=True)
  fontsize = db.IntegerProperty(default=16, required=True)
  height = db.IntegerProperty(default=20, required=True)
  width = db.IntegerProperty(default=200, required=True)
  created = db.DateTimeProperty(auto_now_add=True)
  updated = db.DateTimeProperty(auto_now=True)

  # white list of access
  referers = db.StringProperty(required=True,
      default='{"http://localhost:8080/htmltest":0}'
  )

  # black list of access
  style = db.TextProperty(required=True, default="""
      .normal {background: #FFF; color: #000;}
  """)
  ignoreaddrs = db.TextProperty(default="{}", required=True)
  ignorereferers = db.TextProperty(default="{}", required=True)

  # black list of access
  blacklist = db.TextProperty(default="{}", required=True)
主要

count, referers

制御

ignoreaddrs, ignorereferers, blacklist

見栄え

style(SVGのCSS), width/height, fontsize

とりあえず

name, updated/created

今回はrefererでcountを制限するので, count, referersが必須です.

ignore*は一応つけときました. 今回は実装しません?

url.py = URLと処理の対応定義

このプログラムは以下の4つのパスを持ちます.

count.svg, count

カウンタ

countInit

初回DBエンティティの作成

edit

DBエンティティを編集するwebインタフェース

login

editにアクセスした人がgoogleログインしていなかったら こっちから強制的にログインさせます.

その他

上記2つ以外にアクセスした場合のエラー表示や、 reject時のメッセージでのリダイレクト先です.

main/views.py

url.pyより5つのviewを作ります.

今回は簡単なproductなのでclassは使いません.

def count

count.svgのプログラム

def countInit

DBエンティティの作成

GAE/pyは最初にこれが必要です.

管理画面から新規modelのentityは作れないみたいです.

def invalid

countに不正なアクセスをした場合や、login後の htmlを表示します.

def login

editを起動するにはloginが必要なので、 loginをさせるviewです.

def edit

エンティティを編集、表示します.

count.svgの仕様

出力:

SVG

入力:
method:

GET (POSTには未対応)

key:

entityのidを指定

msg:

未使用

REMOTE_ADDR

ブラウザからIPアドレスを取得 指定のない場合は、動作しません.

HTTP_REFERER

ブラウザから参照元URLを取得します. 特定のリンクでしかカウンタが動作しないようにします.

指定のない場合は、動作しません.

引数に不正がある場合、 entityのblacklistというtext propertyに REMOTE_ADDR、HTTP_REFERERを保存します.

実装

bitbucketから ソースがダウンロードできる のでそちらを見てください :D

まとめ

次はgaeunitを使ってdebugしたいです.

あと, entityの編集ですが、 appspot.comからでは、textプロパティが編集できないので 仕方なくmanage.htmlを作りました.

localの時はtextプロパティが管理画面から編集できるんですけど,

作ってdeployした後で気づいたんですが.

コメント

Comments powered by Disqus
宣伝: