HOME > ブログ > Google App Engineでのページング処理

Google App Engineでのページング処理

Webアプリには頻出するページ処理。数ある解の中のひとつの書き方を記します。

そう、決して正解の解ではないですけどね…
誰かに教えてほしい、もっとスマートでスダンダードな書き方を。





以下詳細。


Google App Engineで画像アップローダでの「アップロード画像一覧」にページング処理をつけてみます。

class List(webapp.RequestHandler):
    def get(self):
        """アップロード済み画像一覧"""

        # リクエストデータ処理
        pager_page = cgi.escape(self.request.get("pager_page"))

        # アップロード済み画像データ抽出
        pager_limit = 5 # 1頁に表示する件数
        pager_max = Photo_Upload.all().order('-date').count() # 全件数
        pager_maxpage = int(math.ceil(pager_max / pager_limit)) # 頁数(全件数÷1頁表示件数の切り上げ)
        if pager_page: # 現在の頁判定
            pager_page = int(pager_page)
        else:
            pager_page = 1
        pager_offset = (pager_page-1) * pager_limit; # 何件目からのデータ抽出か
        pics = Photo_Upload.all().order('-date').fetch(pager_limit,pager_offset) # この頁に表示するデータ抽出

        output_html = """<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>画像アップローダ</title>
</head>
<body>
<h1>画像アップローダ</h1>
<br>
<a href="/">戻る</a>
<br>
<br>
<table width="400" border="1">"""
        for pic in pics:
            output_html += "<tr>\n"
            output_html += "<td width=\"110\"><a href=\"/img/"+str(pic.key())+"\" target=\"_blank\">\n"
            output_html += "<img src=\"/img/"+str(pic.key())+"\" width=\"100\"></a></td>\n"
            output_html += "<td><a href=\"/delete?key="+str(pic.key())+"\">del</a> \n"
            output_html += "<a href=\"/detail?key="+str(pic.key())+"\">detail</a><br>\n"
            output_html += "<br>元ファイル名:"+str(pic.filename)+"<br>\n"
            output_html += "サイズ:"+str(math.ceil(pic.size / 1024))+" KB<br>\n"
            output_html += "横幅:"+str(pic.width)+" pix<br>\n"
            output_html += "縦幅:"+str(pic.height)+" pix<br>\n"
            output_html += "MIMEタイプ:"+str(pic.mimetype)+"<br></td>\n"
            output_html += "</tr>\n"

        output_html += """
</table>
<br>
<table width="400">
<tr>"""

        if pager_page > 1:
            output_html += "<td width=\"30%\" align=\"left\">"
            output_html += "<a href=\"/list?pager_page="+str(pager_page-1)+"\">←前頁</a></td>\n"
        else:
            output_html += "<td width=\"30%\"> </td>\n"

        output_html += "<td width=\"40%\" align=\"center\">"+str(pager_page)+" / "+str(pager_maxpage)+"</td>\n"

        if pager_page != pager_maxpage:
            output_html += "<td width=\"30%\" align=\"right\">"
            output_html += "<a href=\"/list?pager_page="+str(pager_page+1)+"\">次頁→</a></td>\n"
        else:
            output_html += "<td width=\"30%\"> </td>\n"

        output_html += """</tr>
</table>
<br>
<br>
<a href="/">戻る</a>
</body>
</html>"""
        self.response.out.write(output_html)


PHPで使っていたコードをそのまま移植してみました。
全件数を調べて、1頁に表示する件数から頁数を求めて、表示する頁によってLIMIT、OFFSETで抽出するデータを変えているだけです。

ずっとしてきたやり方だからいいと言えばいいんですが、もっとスマートでスダンダードなやり方があるんだろうなぁ~っていつも思います。

コードに正しいなんてことはないかもしれないけど、みなさんがどうやっているか知りたい…いやほんとに。



| Python | Comment:0 |
コメント投稿












画像リロード
*半角の小英字、数字で構成されています