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

    xiaoxiao2022-06-24  18

    手里有一些数据,原来是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')
    转载请注明原文地址: https://ju.6miu.com/read-1123664.html

    最新回复(0)