实践 | 用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.pngPython代码托管在GitHub上。