您的位置:首页 > 移动开发 > Android开发

flask + sqlite3 + android 构建RESTful API实现个人信息查询系统 (上(服务器端))

2016-09-14 11:18 786 查看
手里有一些数据,原来是xls格式的,需要查询一些信息的时候用ecxel很不方便,所以便想做一套查询系统,最好是Andriod的,随时随地就可以查询,说干就干。

一、服务器端

1.1

以前没有接触过后端,只做过安卓和前端,在问了其他人和上网搜索比较之后,有以下几种方案:

1.webservice

2.Java

3.Python的flask

考虑到服务器的配置比较低(1核、1G、Ubuntu 14.04)以及需求很简单(移动端请求查询,服务器端处理并向数据库查询后,通过JSON返回到移动端),遂决定采用flask

至于数据库,由于数据比较少,只有几千条,所以采用了sqlite3。

最终服务端要求实现的效果是:提供一套API,移动端访问提供的API地址,服务器将数据通过JSON返回。

1.2 设计一个简单的API

一般情况,一个编号唯一对应一个人,所以只需要请求编号就可以。但有些时候仅知道姓名,这时候需要提供通过姓名查询的方法。
API如下:

HTTP方法URI动作
GEThttp://[hostname]/[id]返回信息
GEThttp://[hostname]/[name]返回信息

1.3 初步了解flask

flask是一个知名的Python框架,可以快速的开发web应用,他的安装和部署也十分快捷。

先安装virtualenv虚拟环境,virtualenv是开发Python必备的,提供Python虚拟环境,可以理解为一个沙箱,防止不同项目之间互相冲突。
使用xshell连接到服务器,执行以下代码:

$ sudo apt-get install python-virtualenv


安装成功之后,创建一个相关环境

$ virtualenv flaskapp


这里virtualenv创建了一个文件夹,flaskapp/,并且设置了一个纯净的python拷贝,同时安装了包管理器pip。
进入新创建的开发环境并激活:(注意第二行period与bin之间有一个空格)

$ cd flaskapp
$ . bin/activate


接下来就可以安全地安装Flask了:

$ pip install Flask


接下来,创建我们的第一个flask应用,看一下flask是否安装成功

$ vi hello.py


在hello.py中写下如下代码:
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/', methods=['GET'])    # '/' 这一部分表示访问的URL
def home():   <span style="white-space:pre">			</span>    # def xxx() 表示对应响应的操作
return "Hello,World"

if __name__ == '__main__':
app.run(debug=True)

保存后,执行
$ python hello.py

访问本地IP,端口5000.
看到如下页面:

[这里应该有张图]

这样,我们的flask就架设成功了。
在这里可能会有一个小问题,在服务器上架设flask,可能有的朋友会在本地机器上直接访问服务器IP,结果却发现无法打开。此时,只需要将最后一句代码改为
app.run(host='0.0.0.0')
这样,就可以被任意IP访问了。

1.4 安装Sqlite3数据库

依然连接服务器,执行
 $ sudo apt-get install sqlite sqlite3
接下来创建数据库
 $
sqlite3 test.db
对于sqlite3的操作,为了方便起见,我们使用WinSCP将其下载到本地,在本地对其进行操作
在这里推荐一个Win下操作sqlite3数据库的小工具 sqlitestudio
在使用过程中可能会报错,不过不用理会就好。
在本地建表,导入数据。

1.4.2 将EXCEL表格转入到数据库中

上千条数据,虽然不多,但是将其手动输入到数据库中似乎是一个不可能完成的任务。幸好sqlitestudio提供了转换功能。

但是需要将xls文件转换成csv之后才可导入,这里又有一个问题:
xls文件转换成csv文件之后,对于长数据项,比如身份证号一类,会造成精度损失。即使将所有单元格设置成“文本”也无济于事。
解决办法:先建立一个空白的csv文件,将所有单元格设置为“文本”格式,然后将原xls文件数据粘贴到新建的csv文件中。 这样就可以保留数据。

建表过程不再赘述。

1.5 编写服务端代码

在flask中使用sqlite3,需要添加如下代码:
def connect_db():
return sqlite3.connect('test.db')

@app.before_request
def before_request():
g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
if hasattr(g, 'db'):
g.db.close()

之后利用游标来查询数据
代码如下:
cursor = sqlite3.connect('test.db').cursor()

cursor.execute(这里嵌入sql语句)

result = cursor.fetchall()
cursor.close()
sqlite3.connect('test.db').close()
这样,数据库查询的数据就保存到了result中
result[0]代表查询到的第一条记录
result[0][0]代表查询到的第一条记录的第一个值

前面我们提到,在flask中 
@app.route('/xxx', methods=['GET'])
def xxx() :
    # 执行代码
表示对http://[hostname]/xxx 进行响应,并执行xxx()函数。为了实现我们设计的API,所以我们为其添加响应编号的代码,并和之前的查询代码综合起来,代码如下:
@app.route('/<int:user_id>', methods=['GET'])
def query(user_id):
cursor = sqlite3.connect('test.db').cursor()

# #query
sql = "select name,stu_id,sex,mz,cla_id,place,ro_id,do_id,date,school,address from myer where stu_id = "+ str(user_id)  <span style="white-space:pre">				</span>#这里通过字符串的方式达到在sql语句中插入变量的目的。
cursor.execute(sql)
result = cursor.fetchall()
print "query has been ok"
print sql
cursor.close()
sqlite3.connect('test.db').close()
return jsonify(
{
'user_id': user_id,
'name': result[0][0],
'stu_id': result[0][1],
'sex': result[0][2],
'mz': result[0][3],
'cla_id': result[0][4],
'place': result[0][5],
'ro_id': result[0][6],
'do_id': result[0][7],
'date': result[0][8],
'address': result[0][9]
})

(通过flask的jsonify实现对数据的JSON化)
接下来实现用名字来查询,方法大同小异,就不再赘述了。
值得注意的是,为了防止查询中文引起的编码错误,需要在hello.py的开头加入如下代码:
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
同时,在查询的sql语句中,中文的两端需要加上双引号
sql = "select name,stu_id,sex,mz,cla_id,place,ro_id,do_id,date,school,address from myer where name = "+"\""+user_name+"\""

注意引号个数。

1.6 完整代码

到这里,服务器端就算是开发完成了。完整代码如下:
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
import sqlite3
from flask import g
from flask import Flask, jsonify

app = Flask(__name__)

def connect_db(): return sqlite3.connect('test.db') @app.before_request def before_request(): g.db = connect_db() @app.teardown_request def teardown_request(exception): if hasattr(g, 'db'): g.db.close()

@app.route('/<int:user_id>', methods=['GET'])
def query(user_id):
cursor = sqlite3.connect('test.db').cursor()

# #query
sql = "select name,stu_id,sex,mz,cla_id,place,ro_id,do_id,date,school,address from myer where stu_id = "+ str(user_id)
cursor.execute(sql)
result = cursor.fetchall()
print "query has been ok"
print sql
cursor.close()
sqlite3.connect('test.db').close()
return jsonify(
{
'user_id': user_id,
'name': result[0][0],
'stu_id': result[0][1],
'sex': result[0][2],
'mz': result[0][3],
'cla_id': result[0][4],
'place': result[0][5],
'ro_id': result[0][6],
'do_id': result[0][7],
'date': result[0][8],
'address': result[0][9]
})

@app.route('/<user_name>', methods=['GET'])
def query_a(user_name):
cursor = sqlite3.connect('test.db').cursor()

# #query
sql = "select name,stu_id,sex,mz,cla_id,place,ro_id,do_id,date,school,address from myer where name = "+ "\""+user_name+"\""
cursor.execute(sql)
result = cursor.fetchall()
print "query has been ok"
print sql
cursor.close()
sqlite3.connect('test.db').close()
return jsonify(
{
'name': result[0][0],
'stu_id': result[0][1],
'sex': result[0][2],
'mz': result[0][3],
'cla_id': result[0][4],
'place': result[0][5],
'ro_id': result[0][6],
'do_id': result[0][7],
'date': result[0][8],
'address': result[0][9]
})

@app.route('/', methods=['GET'])
def home():
return "11"

@app.route('/ok', methods=['GET'])
def ok():
return "Hello,World"

@app.errorhandler(404)
def page_not_found(e):
res = jsonify({'error': 'not found'})
res.status_code = 404
return res

if __name__ == '__main__':
app.run(host='0.0.0.0')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐