Unity结合Flask实现排行榜功能

发表于:2015-04-01来源:uml.org.cn作者:娃娃点击数: 标签:Unity
业余做的小游戏,排行榜本来是用PlayerPrefs存储在本地,现在想将数据放在服务器上。因为功能很简单,就选择了小巧玲珑的Flask来实现。 闲话少叙。首先考虑URL的设计。排行榜无

  业余做的小游戏,排行榜本来是用PlayerPrefs存储在本地,现在想将数据放在服务器上。因为功能很简单,就选择了小巧玲珑的Flask来实现。

  闲话少叙。首先考虑URL的设计。排行榜无非是一堆分数score的集合,按照REST的思想,不妨将URL设为/scores。用GET获得排行榜数据,用POST添加一条新纪录到排行榜。此外,按照惯例,排行榜的数据不需要更新和删除。

  Flask自身不支持REST,但我们可以通过route和method自己实现。下面创建一个原型版本的rank_server.py。命名沿袭了Rails的习惯:

from flask import Flask
  app = Flask(__name__)
  @app.route('/scores', methods=['GET'])
  def index():
  return 'index'
  @app.route('/scores', methods=['POST'])
  def create():
  return 'create'
  if __name__ == '__main__':
  app.run(debug=True)

  执行python rank_server.py来启动自带的服务器。下面我们安装cURL来测试应用。

 brew install curl

  测试GET:

`curl -i -X GET 127.0.0.1:5000/scores`

  测试POST:

`curl -i -X POST 127.0.0.1:5000/scores`

  -i参数可以展示响应的头部信息,便于debug。-X参数指定请求的方法method。

  可以看到测试成功。

  下面我们建立存储数据的表。本地测试我们使用sqlite,之后部署使用mysql

  建表文件create_rank.sql内容如下:

DROP TABLE IF EXISTS rank;
  CREATE TABLE rank(
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name VARCHAR(255) NOT NULL,
  score INTEGER NOT NULL
  );

  Mac自带sqlite。执行下面语句导入sql文件:

sqlite3 rank.db < create_rank.sql

  然后随便插入几条测试数据。如:

INSERT INTO rank (name, score) VALUES ('A', 100);
  INSERT INTO rank (name, score) VALUES ('B', 200);
  INSERT INTO rank (name, score) VALUES ('C', 300);

  针对数据库,我们在rank_server.py中加入下面一段代码,用于在请求前后处理数据库连接。

import sqlite3
  DATABASE = 'rank.db'
  @app.before_request
  def before_request():
  g.db = sqlite3.connect(DATABASE)
  @app.teardown_request
  def teardown_request(exception):
  if hasattr(g, 'db'):
  g.db.close()

  我们规定服务器和客户端使用JSON传输数据。

  GET请求返回的JSON格式如下:

{
"data":
[
{
"id": 0,
"name": "A",
"score": 100
},
{
"id": 1,
"name": "B",
"score": 200
}
]
}

原文转自:http://www.uml.org.cn/Test/201503235.asp