python实现数据接口分页,其实是要解决以下几个问题:
一、接口结构熟悉
二、接口路由规则
三、url中变量使用
理解了上边的几个点就可以开始编写接口了,当然,这个只是针对测试,如果需要在生产环境中部署,那么就需要增加几个步骤。
一、发布到服务器后host,port进行更改
二、承压测试(虽然我们所写的接口代码全部是调用第三方库实现,但是我们还是要去做承压测试,这样才能清楚接口的极限在那里。我这里每页返回的值及接口规范是遵守公司的规范写的。承压测试可以用多线程、多进程或二者结合的方式。其实承压测试主要是为了测试接口同时可以接受多少台机器访问。而且接口还要注意sql注入。上述的代码中,未对sql注入问题做出预处理。所以在使用中需要注意)
三、下述的代码重点其实是想要记录一下 实现原理。在这几行代码中,其实漏洞蛮多的,在这里没有做相关的优化,如数据库连接放在里边,虽然以目前的数据库性能,数据库连接可以很大,但毕竟有限,所以需要做数据池方案,针对数据库并发访问问题。
四、并发测试接口承担压力,代码有写好,其实也很简单,就在下一次分享吧
#python中实现接口分页。理解路由中使用变量的方式
# 原理其实很简单,只是对sql进行分页即可,然后把limit后的值和offset后的值做为变量传入即可
from flask import Flask
import pymysql
import math
app = Flask(__name__)
@app.route('/get_data/page_num=<int:num>&page_size=<int:size>/')
def get_data(num,size):
conn = pymysql.connect(host='localhost',port=3306,database='test_info',user='root',password='root')
cursor = conn.cursor()
sql = "select table_name,column_name from information_schema.columns where table_name = 'data_sink';"
cursor.execute(sql)
data = cursor.fetchall()
column_list = [data[i][1] for i in range(len(data))]
sql_2 = "select count(1) from test_info.data_sink;"
cursor.execute(sql_2)
out_data = {}
counts = cursor.fetchall()[0][0]
page_num = math.ceil(counts / size)
info_dict = {}
info_dict['totalNum'] = counts
info_dict['pageSize'] = size
sql_3 = "select * from test_info.data_sink limit %d offset %d;"%(size,num*2000)
cursor.execute(sql_3)
data_2000 = cursor.fetchall()
data_list = []
for j1 in range(len(data_2000)):
data_dict = {}
for j2 in range(len(column_list)):
data_dict[column_list[j2]] = data_2000[j1][j2]
data_list.append(data_dict)
info_dict['rows'] = data_list
out_data['data'] = info_dict
return out_data
if __name__ == '__main__':
app.run(host='localhost',port='8000')