通過使用Python中 Flask 框架實現一個簡單的API接口程序,用戶可發送JSON格式的請求,服務器響應相應的JSON格式給客戶。
簡單的登錄接口調用: 最簡單的Flask接收數據請求並處理的案例如下。
from flask import Flask, render_template, request, redirect
import json
app = Flask(__name__, template_folder="templates")
@app.route('/login', methods=['GET', 'POST'])
def login():
return_dict = {'status': '0', 'key': 'none'}
if request.method == 'GET':
# 判斷參數不爲0
if len(request.args) != 0:
get_data = request.args.to_dict()
username = get_data.get("username")
password = get_data.get("password")
print("GET => username = {} password = {}".format(username,password))
return json.dumps(return_dict, ensure_ascii=False)
if request.method == "POST":
if len(request.get_data()) != 0:
username = request.values.get("username")
password = request.values.get("password")
print("username = {} => password = {}".format(username,password))
if(username=="lyshark" and password == "123456"):
return_dict["status"] = "1"
return_dict["key"] = "1f3dsgf9834r98ugdf98gjd"
return json.dumps(return_dict, ensure_ascii=False)
return json.dumps(return_dict, ensure_ascii=False)
@app.route('/lat',methods=['GET', 'POST'])
def lat():
return_dict = {'status': '0','x': 'none', 'y':'none'}
if request.method == 'GET':
return json.dumps(return_dict, ensure_ascii=False)
if request.method == "POST":
if len(request.get_data()) != 0:
key = request.values.get("key")
tel = request.values.get("tel")
print("key = {} => tel = {}".format(key,tel))
if(key=="1f3dsgf9834r98ugdf98gjd"):
return_dict["status"] = "1"
return_dict['x'] = '12.5'
return_dict['y'] = '22.4'
return json.dumps(return_dict, ensure_ascii=False)
return json.dumps(return_dict, ensure_ascii=False)
if __name__ == '__main__':
app.run(port=80,debug=False)
實現簡單的接口請求,首先創建數據庫,增加兩張表,一張用戶表,一張計費表,初始化寫入測試數據。
import sqlite3
# 增加用戶表
def UserDB():
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
create = "create table UserDB(" \
"id int auto_increment primary key," \
"username char(32) not null," \
"password char(32) not null," \
"key char(128) not null" \
")"
cursor.execute(create)
insert = "insert into UserDB(id,username,password,key) values(1,'lyshark','123456','1f3dsgf9834r98ug');"
cursor.execute(insert)
insert = "insert into UserDB(id,username,password,key) values(2,'admin','1233','cef45f9f8480gfi5');"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
# 增加計數表
def CountDB():
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
create = "create table CountDB(" \
"id int auto_increment primary key," \
"username char(32) not null," \
"key char(128) not null," \
"lat_count int not null" \
")"
cursor.execute(create)
insert = "insert into CountDB(id,username,key,lat_count) values(1,'lyshark','1f3dsgf9834r98ug',0);"
cursor.execute(insert)
insert = "insert into CountDB(id,username,key,lat_count) values(2,'admin','cef45f9f8480gfi5',0);"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
UserDB()
CountDB()
'''
創建用戶驗證表
UserDB(id,username,password,key)
創建計數表
CountDB(id,key,lat_count,,,,,)
'''
增加測試接口: 定義並實現一些基本的功能,這些功能如下:
- login 用戶登錄接口
- is_login 判斷用戶是否登錄
- get_lat 模擬返回經緯度
- get_count 獲取調用次數
from flask import Flask, render_template, request, redirect
import json,sqlite3
# 手機號規則
TelList = ["130", "131", "132", "145", "155", "156", "175", "176", "185", "186", "166", "146", "10646"]
app = Flask(__name__, template_folder="templates")
def run_sql(sql):
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
return cursor.fetchall()
# 用戶登錄
@app.route('/login', methods=['POST'])
def login():
return_dict = {'status': '0', 'key': 'none'}
if request.method == 'GET':
return json.dumps(return_dict, ensure_ascii=False)
if request.method == "POST":
if len(request.get_data()) != 0:
username = request.values.get("username")
password = request.values.get("password")
# 驗證賬號密碼是否正確
ref_data = run_sql("select * from UserDB;")
for data in ref_data:
# 正確返回key
if (data[1] == username) and (data[2] == password):
return_dict["status"] = "1"
return_dict["key"] = data[3]
return json.dumps(return_dict, ensure_ascii=False)
return json.dumps(return_dict, ensure_ascii=False)
# 判斷是否登錄
@app.route('/is_login',methods=['POST'])
def is_login():
return_dict = {'status': '0','user': 'none'}
if request.method == 'GET':
return json.dumps(return_dict, ensure_ascii=False)
if request.method == "POST":
if len(request.get_data()) != 0:
key = request.values.get("key")
# 驗證是否登錄
ref_data = run_sql("select * from UserDB;")
for data in ref_data:
if(data[3] == key):
return_dict['status'] = "1"
return_dict['user'] = data[1]
return json.dumps(return_dict, ensure_ascii=False)
return json.dumps(return_dict, ensure_ascii=False)
# 模擬返回經緯度
@app.route('/get_lat',methods=['POST'])
def get_lat():
return_dict = {'status': '0','mobile': 'none', 'longitude': 'none','latitude': 'none'}
if request.method == 'GET':
return json.dumps(return_dict, ensure_ascii=False)
if request.method == "POST":
if len(request.get_data()) != 0:
key = request.values.get("key")
mobile = request.values.get("mobile")
# 通過說明是聯通的手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 驗證是否登錄
ref_data = run_sql("select * from UserDB;")
for data in ref_data:
if(data[3] == key):
return_dict['status'] = '1'
return_dict['mobile'] = mobile
return_dict['longitude'] = '172.43'
return_dict['latitude'] = '22.56'
# 定位次數+1
ref_data = run_sql("select lat_count from CountDB where key='{}';".format(key))
new_count = int(ref_data[0][0]) + 1
run_sql("update CountDB set lat_count={} where key='{}'".format(new_count,key))
return json.dumps(return_dict, ensure_ascii=False)
return json.dumps(return_dict, ensure_ascii=False)
# 獲取計數
@app.route('/get_count',methods=['POST'])
def get_count():
return_dict = {'status': '0','lat_count': '0'}
if request.method == 'GET':
return json.dumps(return_dict, ensure_ascii=False)
if request.method == "POST":
if len(request.get_data()) != 0:
key = request.values.get("key")
# 查詢統計次數
ref_data = run_sql("select * from CountDB where key='{}';".format(key))
return_dict['status'] = '1'
return_dict['lat_count'] = str(ref_data[0][3])
return json.dumps(return_dict, ensure_ascii=False)
if __name__ == '__main__':
app.run(port=80,debug=False)
完善動態登錄功能: 上方登錄時Key是固定的,我們再次調整,實現每次用戶登錄Key都會自動變化一次,當用戶不使用的時候直接登出處理。
首先創建數據庫
import sqlite3
# 增加用戶表
def UserDB():
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
create = "create table UserDB(" \
"id int auto_increment primary key," \
"username char(32) not null," \
"password char(32) not null," \
"user_key char(128) not null," \
"company char(256) not null," \
"lat_count int not null" \
")"
cursor.execute(create)
insert = "insert into UserDB(id,username,password,user_key,company,lat_count) values(1,'lyshark','123456','1f3dsgf9834r98ug','聯通數科',0);"
cursor.execute(insert)
insert = "insert into UserDB(id,username,password,user_key,company,lat_count) values(2,'admin','1233','cef45f9f8480gfi5','聯通數科',0);"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
UserDB()
Flask框架完善登錄登出功能,代碼如下:
from flask import Flask, render_template, request, redirect
import json,sqlite3
import random,string
# 手機號規則
TelList = ["130", "131", "132", "145", "155", "156", "175", "176", "185", "186", "166", "146", "10646"]
app = Flask(__name__, template_folder="templates")
# 查詢SQL
def select_sql(sql):
try:
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
return cursor.fetchall()
except Exception:
return False
# 寫出SQL
def update_sql(sql):
try:
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
return True
except Exception:
return False
# 生成一個指定長度的隨機字符串
def generate_random_str(randomlength=32):
"""
string.digits=0123456789
string.ascii_letters=abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
"""
str_list = [random.choice(string.digits + string.ascii_letters) for i in range(randomlength)]
random_str = ''.join(str_list)
return random_str
# ----------------------------------------------------------------------------------------------------------------------
# 登錄 + 驗證 + 登出
# ----------------------------------------------------------------------------------------------------------------------
# 用戶登錄
@app.route('/login', methods=['GET','POST','PUT','HEAD','DELETE'])
def login():
return_dict = {'status': '0', 'key': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
username = request.values.get("username")
password = request.values.get("password")
# 驗證賬號密碼是否正確
ref_data = select_sql("select * from UserDB;")
print(ref_data)
# 當查詢不爲假則執行
if ref_data != False:
for data in ref_data:
# 正確返回key
if (data[1] == username) and (data[2] == password):
# 生成並寫入隨機數
uuid = generate_random_str(32)
if update_sql("update UserDB set user_key='{}' where username='{}'".format(uuid, data[1])) != False:
return_dict["status"] = "1"
return_dict["key"] = uuid
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["key"] = "密鑰更新失敗"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["key"] = "查詢記錄失敗"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["key"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["key"] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["key"] = "用戶名或密碼錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 判斷是否登錄
@app.route('/is_login',methods=['GET','POST','PUT','HEAD','DELETE'])
def is_login():
return_dict = {'status': '0','user': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
key = request.values.get("key")
# 驗證是否登錄
ref_data = select_sql("select * from UserDB;")
if ref_data != False:
for data in ref_data:
if(data[3] == key):
return_dict['status'] = "1"
return_dict['user'] = data[1]
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["key"] = "查詢記錄失敗"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["user"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict['status'] = "0"
return_dict['user'] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["user"] = "密鑰失效,請重新登錄"
return json.dumps(return_dict, ensure_ascii=False)
# 用戶登出
@app.route('/logout',methods=['GET','POST','PUT','HEAD','DELETE'])
def logout():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
key = request.values.get("key")
uuid = generate_random_str(32)
# 用戶登出
if update_sql("update UserDB set user_key='{}' where user_key='{}'".format(uuid, key)) != False:
return_dict["status"] = "1"
return_dict["message"] = "已登出"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["message"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict['status'] = "1"
return_dict['message'] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未登錄,請登陸"
return json.dumps(return_dict, ensure_ascii=False)
if __name__ == '__main__':
app.run(port=80,debug=False)
增加針對定位對象組操作: 將多個表關聯起來,並實現,創建,查詢,刪除,定位對象功能。
SQL建庫建表
import sqlite3
# 增加用戶表
def UserDB():
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
create = "create table UserDB(" \
"username char(32) not null," \
"password char(32) not null," \
"user_key char(128) not null," \
"company char(256) not null," \
"lat_count int not null" \
")"
cursor.execute(create)
insert = "insert into UserDB(username,password,user_key,company,lat_count) values('lyshark','123456','1f3dsgf9834r98ug','聯通數字科技有限公司',0);"
cursor.execute(insert)
insert = "insert into UserDB(username,password,user_key,company,lat_count) values('admin','1233','cef45f9f8480gfi5','聯通數字科技有限公司',0);"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
# 登錄創建定位對象表
def ObjectDB():
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
create = "create table ObjectDB(" \
"user_key char(128) not null," \
"uname char(32) not null," \
"mobile char(32) not null," \
"ugroup char(32) not null," \
"service_mobile char(32) not null," \
"message_name char(512) not null," \
"lat_count int not null," \
"is_auth char(32) not null" \
")"
cursor.execute(create)
insert = "insert into ObjectDB(user_key,uname,mobile,ugroup,service_mobile,message_name,lat_count,is_auth) " \
"values('1f3dsgf9834r98ug','王瑞','15646596977','系統技術部','67882255','你好世界,這是一段測試文檔',0,'未授權用戶');"
cursor.execute(insert)
insert = "insert into ObjectDB(user_key,uname,mobile,ugroup,service_mobile,message_name,lat_count,is_auth) " \
"values('cef45f9f8480gfi5','鄭凱','15646585548','系統技術部','67882255','你好世界,這是一段測試文檔',0,'未授權用戶');"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
if __name__ == "__main__":
UserDB()
ObjectDB()
Flask代碼如下:
from flask import Flask, request
import json,sqlite3
import random,string
# 手機號規則
TelList = ["130", "131", "132", "145", "155", "156", "175", "176", "185", "186", "166", "146", "10646"]
# 數據庫文件
sql_file = "database.db"
app = Flask(__name__, template_folder="templates")
# 查詢SQL
def select_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
return cursor.fetchall()
except Exception:
return False
# 插入新記錄SQL
def insert_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
return True
except Exception:
return False
# 更新SQL
def update_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
return True
except Exception:
return False
# 刪除記錄SQL
def delete_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
return True
except Exception:
return False
# 生成一個指定長度的隨機字符串
def generate_random_str(randomlength=32):
"""
string.digits=0123456789
string.ascii_letters=abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
"""
str_list = [random.choice(string.digits + string.ascii_letters) for i in range(randomlength)]
random_str = ''.join(str_list)
return random_str
# ----------------------------------------------------------------------------------------------------------------------
# 登錄 + 驗證 + 登出
# ----------------------------------------------------------------------------------------------------------------------
# 用戶登錄
@app.route('/login', methods=['POST'])
def login():
return_dict = {'status': '0', 'token': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
username = request.values.get("username")
password = request.values.get("password")
# 驗證賬號密碼是否正確
ref_data = select_sql("select * from UserDB;")
# 當查詢不爲假則執行
if ref_data != False:
for data in ref_data:
# 正確返回key
if (data[0] == username) and (data[1] == password):
return_dict["status"] = "1"
return_dict["token"] = data[2]
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["token"] = "查詢記錄失敗"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["token"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["token"] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["token"] = "用戶名或密碼錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 判斷是否登錄
@app.route('/is_login',methods=['POST'])
def is_login():
return_dict = {'status': '0','user': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
key = request.values.get("token")
# 驗證是否登錄
ref_data = select_sql("select * from UserDB;")
if ref_data != False:
for data in ref_data:
if(data[2] == key):
return_dict['status'] = "1"
return_dict['user'] = data[0]
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["user"] = "查詢記錄失敗"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["user"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict['status'] = "0"
return_dict['user'] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["user"] = "密鑰失效,請重新登錄"
return json.dumps(return_dict, ensure_ascii=False)
# 刷新用戶Token
@app.route('/flush_token',methods=['POST'])
def flush_token():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
key = request.values.get("token")
uuid = generate_random_str(32)
# 用戶登出 更新第一張表中的Key
if update_sql("update UserDB set user_key='{}' where user_key='{}'".format(uuid, key)) != False:
# 更新第二張表中的Key
if update_sql("update ObjectDB set user_key='{}' where user_key='{}'".format(uuid, key)) != False:
return_dict["status"] = "1"
return_dict["message"] = "已刷新"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["message"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict['status'] = "0"
return_dict['message'] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 定位對象相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 創建定位對象
@app.route('/create_object',methods=['POST'])
def create_object():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 6:
key = request.values.get("token")
uname = request.values.get("uname")
mobile = request.values.get("mobile")
ugroup = request.values.get("ugroup")
service_mobile = request.values.get("service_mobile")
message_name = request.values.get("message_name")
# 驗證是否是聯通手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 檢查表內是否存在手機號
ref_mobile_data = select_sql("select count(mobile) from ObjectDB where mobile='{}'".format(mobile))
if int(ref_mobile_data[0][0]) == 0:
# 開始構建插入數據庫語句
insert_ref = "insert into ObjectDB(user_key,uname,mobile,ugroup,service_mobile,message_name,lat_count,is_auth) " \
"values('{}','{}','{}','{}','{}','{}',0,'未授權用戶');".format(key,uname,mobile,ugroup,service_mobile,message_name)
insert_ref_flag = insert_sql(insert_ref)
if insert_ref_flag == True:
return_dict["status"] = "1"
return_dict["message"] = "已新增定位對象"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "新增定位對象失敗"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "手機號已存在,無法繼續創建"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入Key密鑰對錯誤"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "請輸入聯通手機號"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 查詢所有定位對象
@app.route('/select_all_object',methods=['POST'])
def select_all_object():
return_dict = {'status': '0','count': '0', 'message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 定義組合模板
object_list = []
ref_data_object = select_sql("select * from ObjectDB;")
if ref_data_object != False:
# 循環組合成JSON
for item in ref_data_object:
li = [item[1],item[2],item[3],item[4],item[5]]
object_list.append(li)
return_dict["status"] = "1"
return_dict["count"] = len(object_list)
return_dict["message"] = object_list
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 刪除定位對象
@app.route('/delete_object',methods=['POST'])
def delete_object():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 驗證是否是聯通手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
ref = delete_sql("delete from ObjectDB where mobile = '{}'".format(mobile))
if ref == True:
return_dict["status"] = "1"
return_dict["message"] = "定位對象已刪除"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "請輸入聯通手機號"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 用戶組相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 查詢所有用戶組
@app.route('/select_all_group',methods=['POST'])
def select_all_group():
return_dict = {'status': '0','count': 'none', 'message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 定義組合模板
object_list = []
# 查詢組並去重後放入ref
ref_select_data = select_sql("select ugroup from ObjectDB;")
if ref_select_data != False:
for each in ref_select_data:
object_list.append(each[0])
ref = list( set(object_list) )
ref_count = len(set(object_list))
# 返回系統部門
return_dict["status"] = "1"
return_dict["count"] = ref_count
return_dict["message"] = ref
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 查詢用戶組成員
@app.route('/select_user_group',methods=['POST'])
def select_user_group():
return_dict = {'status': '0','count': 'none', 'group':'none', 'message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
ugroup = request.values.get("group")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 定義組合模板
object_list = []
# 查詢組並去重後放入ref
ref_select_data = select_sql("select uname,mobile,is_auth from ObjectDB where ugroup='{}';".format(ugroup))
if ref_select_data != False:
for each in ref_select_data:
object_list.append(each)
# 返回系統部門
return_dict["status"] = "1"
return_dict["count"] = len(object_list)
if len(object_list)==0:
return_dict["group"] = "none"
else:
return_dict["group"] = ugroup
return_dict["message"] = object_list
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 修改用戶組
@app.route('/update_user_group',methods=['POST'])
def update_user_group():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 3:
key = request.values.get("token")
mobile = request.values.get("mobile")
ugroup = request.values.get("group")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 更新用戶組
if update_sql("update ObjectDB set ugroup='{}' where user_key='{}' and mobile='{}'".format(ugroup,key,mobile)) != False:
# 返回系統部門
return_dict["status"] = "1"
return_dict["message"] = "已更新"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 經緯度返回相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 模擬返回經緯度
@app.route('/get_lat',methods=['POST'])
def get_lat():
return_dict = {'status': '0','mobile': 'none', 'longitude': 'none','latitude': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 通過說明是聯通的手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if(each[0] == key):
# 判斷是否爲授權用戶
select_auth = select_sql("select is_auth from ObjectDB where mobile='{}'".format(mobile))
if select_auth[0][0] != "已授權用戶":
return_dict = {'status': '0', 'message': '未授權用戶,請授權'}
return json.dumps(return_dict, ensure_ascii=False)
else:
# 如果授權了,直接定位返回結果
return_dict['status'] = '1'
return_dict['mobile'] = mobile
return_dict['longitude'] = '172.43'
return_dict['latitude'] = '22.56'
# UserDB 中的定位次數遞增一次
ref_UserDB_Count = select_sql("select lat_count from UserDB where user_key='{}';".format(key))
if ref_UserDB_Count != False:
new_count = int(ref_UserDB_Count[0][0]) + 1
update_sql("update UserDB set lat_count={} where user_key='{}'".format(new_count,key))
# ObjectDB 中的定位次數遞增一次
ref_Object_Count = select_sql("select lat_count from ObjectDB where mobile='{}'".format(mobile))
if ref_Object_Count != False:
new_count = int(ref_Object_Count[0][0]) + 1
update_sql("update ObjectDB set lat_count={} where mobile='{}'".format(new_count,mobile))
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '請輸入聯通手機號'}
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0','message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return json.dumps(return_dict, ensure_ascii=False)
# 查詢總調用定位次數
@app.route('/select_all_count',methods=['POST'])
def select_all_count():
return_dict = {'status': '0','lat_count': '0'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢統計次數
ref_data = select_sql("select lat_count from UserDB where user_key='{}';".format(key))
return_dict['status'] = '1'
return_dict['lat_count'] = str(ref_data[0][0])
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0','message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# 查詢某手機號調用次數
@app.route('/select_mobile_count',methods=['POST'])
def select_mobile_count():
return_dict = {'status': '0','mobile': 'none', 'lat_count': '0'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 通過說明是聯通的手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢統計次數
ref_data = select_sql("select lat_count from ObjectDB where mobile='{}';".format(mobile))
return_dict['status'] = '1'
return_dict['mobile'] = mobile
return_dict['lat_count'] = str(ref_data[0][0])
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '請輸入聯通手機號'}
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# 查詢某個組調用總次數
@app.route('/select_group_count',methods=['POST'])
def select_group_count():
return_dict = {'status': '0','group': 'none', 'lat_count': '0'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
ugroup = request.values.get("group")
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢統計次數
ref_data = select_sql("select lat_count from ObjectDB where ugroup='{}';".format(ugroup))
group_count = 0
for count in ref_data:
group_count = group_count + int(count[0])
return_dict['status'] = '1'
return_dict['group'] = ugroup
return_dict['lat_count'] = group_count
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 鑑權接口 相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 查詢用戶權限狀態
@app.route('/select_auth_table',methods=['POST'])
def select_auth_table():
return_dict = {'status': '0','unauthorized': [],'authorized': []}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢統計次數
ref_data = select_sql("select mobile,is_auth from ObjectDB;")
not_auth = []
success_auth = []
for each in ref_data:
if each[1] == "未授權用戶":
not_auth.append(each[0])
elif each[1] == "已授權用戶":
success_auth.append(each[0])
return_dict['status'] = '1'
return_dict['unauthorized'] = not_auth
return_dict['authorized'] = success_auth
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 其他 相關接口
# ----------------------------------------------------------------------------------------------------------------------
@app.route('/get_version',methods=['POST'])
def get_version():
return_dict = {'status': '1','version': '1.0.0', 'build': '2021-12-15 9:57'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(404)
def not_found(error):
return_dict = {'status': '1', 'message': '頁面沒有找到'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(405)
def not_found(error):
return_dict = {'status': '1', 'message': '服務器不提供請求類型'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(500)
def not_found(error):
return_dict = {'status': '1', 'message': '錯誤接口'}
return json.dumps(return_dict, ensure_ascii=False)
if __name__ == '__main__':
app.run(port=80,debug=True)
增加驗證碼功能: 對程序增加驗證碼驗證功能,代碼如下:
SQL語句
import sqlite3
db = "database.db"
def DropDB():
conn = sqlite3.connect(db)
cursor = conn.cursor()
drops = "drop table UserDB;"
cursor.execute(drops)
drops = "drop table ObjectDB;"
cursor.execute(drops)
drops = "drop table LocationCountDB;"
cursor.execute(drops)
drops = "drop table VerificationCodeDB;"
cursor.execute(drops)
conn.commit()
cursor.close()
conn.close()
# 用戶表
def UserDB():
conn = sqlite3.connect(db)
cursor = conn.cursor()
create = "create table UserDB(" \
"username char(32) not null," \
"password char(32) not null," \
"user_key char(128) not null" \
")"
cursor.execute(create)
insert = "insert into UserDB(username,password,user_key) values('lyshark','123456','1f3dsgf9834r98ug');"
cursor.execute(insert)
insert = "insert into UserDB(username,password,user_key) values('admin','1233','cef45f9f8480gfi5');"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
# 定位對象表
def ObjectDB():
conn = sqlite3.connect(db)
cursor = conn.cursor()
create = "create table ObjectDB(" \
"user_key char(128) not null," \
"uname char(32) not null," \
"mobile char(32) not null," \
"ugroup char(32) not null," \
"service_mobile char(32) not null," \
"message_name char(512) not null," \
"is_auth char(32) not null" \
")"
cursor.execute(create)
insert = "insert into ObjectDB(user_key,uname,mobile,ugroup,service_mobile,message_name,is_auth) " \
"values('1f3dsgf9834r98ug','王瑞','15646596977','系統技術部','67882255','你好世界,這是一段測試文檔','未授權用戶');"
cursor.execute(insert)
insert = "insert into ObjectDB(user_key,uname,mobile,ugroup,service_mobile,message_name,is_auth) " \
"values('cef45f9f8480gfi5','鄭凱','15646585548','系統技術部','67882255','你好世界,這是一段測試文檔','已授權用戶');"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
# 定位次數費率表
def LocationCountDB():
conn = sqlite3.connect(db)
cursor = conn.cursor()
create = "create table LocationCountDB(" \
"uname char(32) not null," \
"mobile char(32) not null unique," \
"lat_count int not null," \
"lat_rate float not null," \
"trajectory_count int not null," \
"trajectory_rate float not null," \
"enclosure_count int not null," \
"enclosure_rate int not null" \
")"
cursor.execute(create)
insert = "insert into LocationCountDB(uname,mobile,lat_count,lat_rate,trajectory_count,trajectory_rate,enclosure_count,enclosure_rate) " \
"values('王瑞','15646596977',0,0,0,0,0,0);"
cursor.execute(insert)
insert = "insert into LocationCountDB(uname,mobile,lat_count,lat_rate,trajectory_count,trajectory_rate,enclosure_count,enclosure_rate) " \
"values('鄭凱','15646585548',0,0,0,0,0,0);"
cursor.execute(insert)
conn.commit()
cursor.close()
conn.close()
# 驗證碼驗證表
def VerificationCodeDB():
conn = sqlite3.connect(db)
cursor = conn.cursor()
create = "create table VerificationCodeDB(" \
"mobile char(32) not null unique," \
"code char(16) not null unique," \
"time_stamp int not null" \
")"
cursor.execute(create)
conn.commit()
cursor.close()
conn.close()
if __name__ == "__main__":
UserDB()
ObjectDB()
LocationCountDB()
VerificationCodeDB()
Python代碼
from flask import Flask, request
import json,sqlite3
import random,string
import time,datetime
# 手機號規則
TelList = ["130", "131", "132", "145", "155", "156", "175", "176", "185", "186", "166", "146", "10646"]
# 數據庫文件
sql_file = "database.db"
app = Flask(__name__, template_folder="templates")
# 查詢SQL
def select_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
return cursor.fetchall()
except Exception:
return False
# 插入新記錄SQL
def insert_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
return True
except Exception:
return False
# 更新SQL
def update_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
return True
except Exception:
return False
# 刪除記錄SQL
def delete_sql(sql):
try:
conn = sqlite3.connect(sql_file)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
return True
except Exception:
return False
# 生成一個指定長度的隨機字符串
def generate_random_str(randomlength=32):
str_list = [random.choice(string.digits + string.ascii_letters) for i in range(randomlength)]
random_str = ''.join(str_list)
return random_str
# ----------------------------------------------------------------------------------------------------------------------
# 登錄 + 驗證 + 登出
# ----------------------------------------------------------------------------------------------------------------------
# 用戶登錄
@app.route('/login', methods=['POST'])
def login():
return_dict = {'status': '0', 'token': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
username = request.values.get("username")
password = request.values.get("password")
# 驗證賬號密碼是否正確
ref_data = select_sql("select * from UserDB;")
# 當查詢不爲假則執行
if ref_data != False:
for data in ref_data:
# 正確返回key
if (data[0] == username) and (data[1] == password):
return_dict["status"] = "1"
return_dict["token"] = data[2]
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["token"] = "查詢記錄失敗"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["token"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["token"] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["token"] = "用戶名或密碼錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 判斷是否登錄
@app.route('/is_login',methods=['POST'])
def is_login():
return_dict = {'status': '0','user': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
key = request.values.get("token")
# 驗證是否登錄
ref_data = select_sql("select * from UserDB;")
if ref_data != False:
for data in ref_data:
if(data[2] == key):
return_dict['status'] = "1"
return_dict['user'] = data[0]
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["user"] = "查詢記錄失敗"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["user"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict['status'] = "0"
return_dict['user'] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["user"] = "密鑰失效,請重新登錄"
return json.dumps(return_dict, ensure_ascii=False)
# 刷新用戶Token
@app.route('/flush_token',methods=['POST'])
def flush_token():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0:
try:
key = request.values.get("token")
uuid = generate_random_str(32)
# 用戶登出 更新第一張表中的Key
if update_sql("update UserDB set user_key='{}' where user_key='{}'".format(uuid, key)) != False:
# 更新第二張表中的Key
if update_sql("update ObjectDB set user_key='{}' where user_key='{}'".format(uuid, key)) != False:
return_dict["status"] = "1"
return_dict["message"] = "已刷新"
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict["status"] = "0"
return_dict["message"] = "接口異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict['status'] = "0"
return_dict['message'] = "傳入參數不能爲空"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 定位對象相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 創建定位對象
@app.route('/create_object',methods=['POST'])
def create_object():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 6:
key = request.values.get("token")
uname = request.values.get("uname")
mobile = request.values.get("mobile")
ugroup = request.values.get("ugroup")
service_mobile = request.values.get("service_mobile")
message_name = request.values.get("message_name")
# 驗證是否是聯通手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 檢查表內是否存在手機號
ref_mobile_data = select_sql("select count(mobile) from ObjectDB where mobile='{}'".format(mobile))
if int(ref_mobile_data[0][0]) == 0:
# 開始構建插入數據庫語句
insert_ref = "insert into ObjectDB(user_key,uname,mobile,ugroup,service_mobile,message_name,is_auth) " \
"values('{}','{}','{}','{}','{}','{}','未授權用戶');".format(key,uname,mobile,ugroup,service_mobile,message_name)
insert_ref_flag = insert_sql(insert_ref)
if insert_ref_flag == True:
# 同步插入計數計費表
insert_sql("insert into LocationCountDB(uname,mobile,lat_count,lat_rate,trajectory_count,trajectory_rate,enclosure_count,enclosure_rate) " \
"values('{}','{}',0,0,0,0,0,0);".format(uname,mobile))
return_dict["status"] = "1"
return_dict["message"] = "已新增定位對象"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "新增定位對象失敗"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "手機號已存在,無法繼續創建"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入Key密鑰對錯誤"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "請輸入聯通手機號"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 查詢所有定位對象
@app.route('/select_all_object',methods=['POST'])
def select_all_object():
return_dict = {'status': '0','count': '0', 'message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 定義組合模板
object_list = []
ref_data_object = select_sql("select * from ObjectDB;")
if ref_data_object != False:
# 循環組合成JSON
for item in ref_data_object:
li = [item[1],item[2],item[3],item[4],item[5]]
object_list.append(li)
return_dict["status"] = "1"
return_dict["count"] = len(object_list)
return_dict["message"] = object_list
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 刪除定位對象
@app.route('/delete_object',methods=['POST'])
def delete_object():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 驗證是否是聯通手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
ref = delete_sql("delete from ObjectDB where mobile = '{}'".format(mobile))
if ref == True:
return_dict["status"] = "1"
return_dict["message"] = "定位對象已刪除"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "請輸入聯通手機號"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 用戶組相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 查詢所有用戶組
@app.route('/select_all_group',methods=['POST'])
def select_all_group():
return_dict = {'status': '0','count': 'none', 'message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 定義組合模板
object_list = []
# 查詢組並去重後放入ref
ref_select_data = select_sql("select ugroup from ObjectDB;")
if ref_select_data != False:
for each in ref_select_data:
object_list.append(each[0])
ref = list( set(object_list) )
ref_count = len(set(object_list))
# 返回系統部門
return_dict["status"] = "1"
return_dict["count"] = ref_count
return_dict["message"] = ref
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 查詢用戶組成員
@app.route('/select_user_group',methods=['POST'])
def select_user_group():
return_dict = {'status': '0','count': 'none', 'group':'none', 'message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
ugroup = request.values.get("group")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 定義組合模板
object_list = []
# 查詢組並去重後放入ref
ref_select_data = select_sql("select uname,mobile,is_auth from ObjectDB where ugroup='{}';".format(ugroup))
if ref_select_data != False:
for each in ref_select_data:
object_list.append(each)
# 返回系統部門
return_dict["status"] = "1"
return_dict["count"] = len(object_list)
if len(object_list)==0:
return_dict["group"] = "none"
else:
return_dict["group"] = ugroup
return_dict["message"] = object_list
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["group"] = "none"
return_dict["count"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# 修改用戶組
@app.route('/update_user_group',methods=['POST'])
def update_user_group():
return_dict = {'status': '0','message': 'none'}
if request.method == "POST":
# 驗證參數是否一致
if len(request.get_data()) != 0 and len(request.values) == 3:
key = request.values.get("token")
mobile = request.values.get("mobile")
ugroup = request.values.get("group")
# 查詢UserDB表內是否存在用戶傳入的key
ref_data = select_sql("select user_key from UserDB where user_key='{}';".format(key))
if len(ref_data) != 0 and ref_data != False:
# 更新用戶組
if update_sql("update ObjectDB set ugroup='{}' where user_key='{}' and mobile='{}'".format(ugroup,key,mobile)) != False:
# 返回系統部門
return_dict["status"] = "1"
return_dict["message"] = "已更新"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "查詢異常"
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict["status"] = "0"
return_dict["message"] = "傳入參數錯誤"
return json.dumps(return_dict, ensure_ascii=False)
return_dict["status"] = "0"
return_dict["message"] = "未知錯誤"
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 經緯度返回相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 返回經緯度
@app.route('/select_lat',methods=['POST'])
def select_lat():
return_dict = {'status': '0','mobile': 'none', 'longitude': 'none','latitude': 'none'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 通過說明是聯通的手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if(each[0] == key):
# 判斷是否爲授權用戶
select_auth = select_sql("select is_auth,uname from ObjectDB where mobile='{}'".format(mobile))
if select_auth[0][0] != "已授權用戶":
return_dict = {'status': '0', 'message': '未授權用戶,請授權'}
return json.dumps(return_dict, ensure_ascii=False)
else:
# 如果授權了,直接定位返回結果
return_dict['status'] = '1'
return_dict['mobile'] = mobile
return_dict['longitude'] = '172.43'
return_dict['latitude'] = '22.56'
# LocationCountDB 中的定位次數遞增一次
ref_LocationCount = select_sql("select lat_count from LocationCountDB where mobile='{}';".format(mobile))
if ref_LocationCount != False:
new_count = int(ref_LocationCount[0][0]) + 1
update_sql("update LocationCountDB set lat_count={} where mobile='{}'".format(new_count,mobile))
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '請輸入聯通手機號'}
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0','message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return json.dumps(return_dict, ensure_ascii=False)
# 查詢總計調用次數與費率信息
@app.route('/select_all_count',methods=['POST'])
def select_all_count():
return_dict = {'status': '0', 'lat_count': '0', 'lat_rate':'0.00', 'trajectory_count': '0', 'trajectory_rate':'0.00', 'enclosure_count':'0', 'enclosure_rate':'0.0'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢統計次數
ref_data = select_sql("select lat_count,lat_rate,trajectory_count,trajectory_rate,enclosure_count,enclosure_rate"
" from LocationCountDB;")
lat_count = 0
trajectory_count = 0
enclosure_count = 0
# 累加計數器
for item in ref_data:
lat_count = lat_count + int(item[0])
trajectory_count = trajectory_count + int(item[2])
enclosure_count = enclosure_count + int(item[4])
return_dict['status'] = '1'
return_dict['lat_count'] = lat_count
return_dict['lat_rate'] = item[1]
return_dict['trajectory_count'] = trajectory_count
return_dict['trajectory_rate'] = item[3]
return_dict['enclosure_count'] = enclosure_count
return_dict['enclosure_rate'] = item[5]
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0','message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# 查詢某手機號調用次數與費率
@app.route('/select_mobile_count',methods=['POST'])
def select_mobile_count():
return_dict = {'status': '0', 'mobile': 'none', 'lat_count': '0', 'lat_rate':'0.00', 'trajectory_count': '0', 'trajectory_rate':'0.00', 'enclosure_count':'0', 'enclosure_rate':'0.0'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 通過說明是聯通的手機號
if mobile.strip()[0:3] in TelList or mobile.strip()[0:5] in TelList:
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢統計次數
ref_data = select_sql(
"select mobile,lat_count,lat_rate,trajectory_count,trajectory_rate,enclosure_count,enclosure_rate"
" from LocationCountDB where mobile='{}';".format(mobile))
return_dict['status'] = '1'
return_dict['mobile'] = ref_data[0][0]
return_dict['lat_count'] = ref_data[0][1]
return_dict['lat_rate'] = ref_data[0][2]
return_dict['trajectory_count'] = ref_data[0][3]
return_dict['trajectory_rate'] = ref_data[0][4]
return_dict['enclosure_count'] = ref_data[0][5]
return_dict['enclosure_rate'] = ref_data[0][6]
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '請輸入聯通手機號'}
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 鑑權接口 相關接口
# ----------------------------------------------------------------------------------------------------------------------
# 查詢用戶權限狀態
@app.route('/select_auth_table',methods=['POST'])
def select_auth_table():
return_dict = {'status': '0','unauthorized': [],'authorized': []}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 1:
key = request.values.get("token")
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢統計次數
ref_data = select_sql("select mobile,is_auth from ObjectDB;")
not_auth = []
success_auth = []
for each in ref_data:
if each[1] == "未授權用戶":
not_auth.append(each[0])
elif each[1] == "已授權用戶":
success_auth.append(each[0])
return_dict['status'] = '1'
return_dict['unauthorized'] = not_auth
return_dict['authorized'] = success_auth
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# 發送驗證碼
@app.route('/send_message',methods=['POST'])
def send_message():
return_dict = {'status': '0' ,'message':'none'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢是否授權
ref_data = select_sql("select mobile,is_auth from ObjectDB;")
for each in ref_data:
# 如果是未授權則提供驗證
if each[1] == "未授權用戶" and each[0] == mobile:
msg_code = "1234"
# 設置五分鐘時間戳
timeStamp = int(time.time()) + 300
dateArray = datetime.datetime.fromtimestamp(timeStamp)
otherStyleTime = dateArray.strftime("%Y-%m-%d %H:%M:%S")
message_code = "您本次登錄的驗證碼是:{},有效時間:5分鐘。驗證碼有效期至:{}".format(str(msg_code), otherStyleTime)
print(message_code)
insert_sql("insert into VerificationCodeDB(mobile,code,time_stamp) values('{}','{}',{})".format(mobile,msg_code,timeStamp))
return_dict = {'status': '1', 'message': '驗證碼已發送,請注意查收'}
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '用戶已授權過,無需重複授權'}
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# 授權接口
@app.route('/set_auth',methods=['POST'])
def set_auth():
return_dict = {'status': '0','mobile':'none','message':'none'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 4:
key = request.values.get("token")
mobile = request.values.get("mobile")
vf_code = request.values.get("code")
flag = request.values.get("flag")
if flag == "False":
return_dict = {'status': '0', 'message': '如需授權,請接受許可協議'}
return json.dumps(return_dict, ensure_ascii=False)
elif flag == "True":
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢授權記錄
ref_data = select_sql("select is_auth from ObjectDB where mobile='{}';".format(mobile))
# 如果是未授權則繼續
if ref_data[0][0] == "未授權用戶":
LocaltimeStamp = int(time.time())
try:
# 查詢當前用戶驗證碼與時間戳
ref_vfa = select_sql("select mobile,time_stamp from VerificationCodeDB where mobile='{}';".format(mobile))
if ref_vfa != False:
# 驗證時間戳是否有效
if LocaltimeStamp <= ref_vfa[0][1]:
# 檢查用戶輸入驗證碼是否有效,如果有效則將該用戶設置爲已授權用戶.
ref_vf_code = select_sql("select code from VerificationCodeDB where mobile='{}'".format(mobile))
# 驗證碼正確
if ref_vf_code[0][0] == vf_code:
update_sql("update ObjectDB set is_auth='{}' where mobile='{}'".format("已授權用戶",mobile))
return_dict = {'status': '1', 'message': '授權完成'}
return json.dumps(return_dict, ensure_ascii=False)
# 驗證碼錯誤
else:
return_dict = {'status': '1', 'message': '驗證碼錯誤,授權失敗'}
return json.dumps(return_dict, ensure_ascii=False)
elif LocaltimeStamp > ref_vfa[0][1]:
delete_sql("delete from VerificationCodeDB where mobile='{}'".format(mobile))
return_dict = {'status': '0', 'message': '驗證碼已過期,請重新獲取驗證碼'}
return json.dumps(return_dict, ensure_ascii=False)
except Exception:
return_dict = {'status': '0', 'message': '請先發送驗證碼,然後在調用該接口,完成授權'}
return json.dumps(return_dict, ensure_ascii=False)
else:
# 如果已授權過,刪除表中的驗證碼字段
delete_sql("delete from VerificationCodeDB where mobile='{}'".format(mobile))
return_dict = {'status': '0', 'message': '用戶已授權,無需繼續授權'}
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# 取消授權接口
@app.route('/unset_auth',methods=['POST'])
def unset_auth():
return_dict = {'status': '0','mobile':'none','message':'none'}
if request.method == "POST":
if len(request.get_data()) != 0 and len(request.values) == 2:
key = request.values.get("token")
mobile = request.values.get("mobile")
# 驗證是否登錄
ref_UserDB_data = select_sql("select user_key from UserDB;")
if ref_UserDB_data != False:
for each in ref_UserDB_data:
if (each[0] == key):
# 查詢授權記錄
ref_data = select_sql("select is_auth from ObjectDB where mobile='{}';".format(mobile))
# 未授權直接返回
if ref_data[0][0] == "未授權用戶":
return_dict['status'] = '0'
return_dict['mobile'] = mobile
return_dict['message'] = '未授權用戶,無需取消授權'
return json.dumps(return_dict, ensure_ascii=False)
# 已授權直接改爲未授權
else:
if update_sql("update ObjectDB set is_auth='{}' where mobile='{}'".format("未授權用戶",mobile)) != False:
return_dict['status'] = '1'
return_dict['mobile'] = mobile
return_dict['message'] = '取消授權成功'
return json.dumps(return_dict, ensure_ascii=False)
else:
return_dict = {'status': '0', 'message': '傳入參數錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
return_dict = {'status': '0', 'message': '未知錯誤'}
return json.dumps(return_dict, ensure_ascii=False)
# ----------------------------------------------------------------------------------------------------------------------
# 其他功能
# ----------------------------------------------------------------------------------------------------------------------
@app.route('/get_version',methods=['POST'])
def get_version():
return_dict = {'status': '1','version': '1.0.0', 'build': '2021-12-15 9:57'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(404)
def not_found(error):
return_dict = {'status': '404', 'message': '頁面沒有找到'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(405)
def not_found(error):
return_dict = {'status': '405', 'message': '服務器不提供請求類型'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(500)
def not_found(error):
return_dict = {'status': '500', 'message': '傳入參數有誤,或存在不規範輸入'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(400)
def not_found(error):
return_dict = {'status': '400', 'message': 'Bad Request'}
return json.dumps(return_dict, ensure_ascii=False)
@app.errorhandler(409)
def not_found(error):
return_dict = {'status': '409', 'message': 'Conflict'}
return json.dumps(return_dict, ensure_ascii=False)
if __name__ == '__main__':
app.run(port=80,debug=False)