实践 | 用SAE搭建Python应用,实现简单的网页访问量统计

2016-04-22  本文已影响691人  8c9c47c26245

SAE(Sina Applacation Engine)是新浪云应用引擎。可以快速部署php,python等web应用。

第一步,注册新浪云账号并创建一个Python应用

注册地址:http://www.sinacloud.com/

创建一个Python类型的应用,并根据引导填写信息。创完成会在控制台有一条记录:

Paste_Image.png

第二步,编写服务器端代码,实现访问量统计

SAE的Python应用是基于WSGI矿建的,它有两个要求:
1、入口是index.wsgi文件
2、文件中要有一个application对象、并且是一个标准的WSGI应用对象。

index.wsgi代码:

import sae
import json
from counter import Counter

from cgi import parse_qs

## A wsgi applacation.
## for test in a browser: http://wangxiaokuai.applinzi.com/?key=wangxiaokuai
def simple_app(environ, start_response):
    """Simplest possible application object"""

    # parse query string

    query_dict = parse_qs(environ["QUERY_STRING"])  

    key = query_dict.get("key", [""]).pop(0)

    counter = Counter(key)
    counter.increase()
    data = {}
    data["total_points"] = counter.get()

    status = '200 OK'
    response_headers = [('Content-type','application/json')]
    response_headers.append(("Access-Control-Allow-Origin", "*"))
    
    start_response(status, response_headers)
    return json.dumps(data)

application = sae.create_wsgi_app(simple_app)

index.wsgi只有一个功能:每次收到请求,通过解析URL中的QUERY_STRING,将该key的访问次数加一,并返回。

counter.py实现了一个计数器功能,并使用了SAE提供的KVDB服务保存持久化数据。KVDB是key-value型数据库,通过sae.kvdb.Client对象即可访问。

import sae.kvdb

class Counter():
    def __init__(self, name):
        self.name = name
        self.kv_client = sae.kvdb.Client()

    def increase(self):
        count = self.kv_client.get(self.name)
        if count == None:
            count = 0

        count += 1

        self.kv_client.set(self.name, count)

        return count

    def get(self):
        return self.kv_client.get(self.name)

    def reset(self):
        self.kv_client.set(self.name, 0)

第三步,通过Git上传代码到SAE

下载git客户端,通过git bush在你本地git代码目录里,添加一个新的git远程仓库sae

mkdir git001
cd git001
git init
git remote add sae https://git.sinacloud.com/wangxiaokuai

编辑代码并将代码部署到sae的版本1。

git add .
git commit -am "make it better"
git push sae master:1       # 然后会提示输管理员口令

现在,用SAE提供的访问地址访问该服务。每刷新一次页面,total_points都会加一!

Paste_Image.png

第四步,将访问量统计功能,添加到页面中。

index.js中,通过jQuery的接口向服务端发送Ajax请求,这样每次加载index.js脚本,服务端都会增加一个访问量。
然后脚本将服务器返回的数据,显示在了id为"total_points"的页面元素上。
index.js代码

$(document).ready(function(){
    url = "http://wangxiaokuai.applinzi.com?key=wangxiaokuai.github.io"

    var data = $.get(url, function(data, status){

        $("#total_points").text(data.total_points)
    })

}); // end of $.ready()

index.html代码:

<script src="/script/index.js"></script>
......

<p><span>访问:<span id="total_points"></span>次</span>

同理对每一篇博客文章,添加阅读次数统计。每篇文章要有一个算法去获取它的唯一ID作为key。
post.js代码:

$(document).ready(function(){
    var page_id = $("#page_id").text()

    if (page_id) {
        url = "http://wangxiaokuai.applinzi.com" + "?key=" + page_id
        console.log(url)

        var data = $.get(url, function(data, status){

            console.log(data)
            console.log(data.total_points)
            $("#read_times").text(data.total_points)
        })
    }

}); // end of $.ready()

post.html相关代码:

<script src="/script/post.js"></script>
......
<span>阅读:<span id="read_times"></span></span>

Bingo!

Paste_Image.png Paste_Image.png

Python代码托管在GitHub上。

上一篇下一篇

猜你喜欢

热点阅读