Flask返回重复的列表

时间:2019-06-06 07:47:40

标签: python flask duplicates

我有一个flask应用程序后端(获取),该应用程序返回一个计数器元素(列表)。当多次提交相同的请愿书时,它会继续添加每个元素。

flask get return应该只返回该请求的值,而不返回存储在某种本地存储器中的值。 Devicedict1包含每个ID的字段列表:目的地,来源,所售票的价格,会员计划等。 Mydict8包含每个设备ID的所有记录,以及出售给该设备ID的所有票证。例如,mydict8 [2] [12]-包含此购买的原始站点,mydict8 [3] [12]-包含此购买的另一个原始站点等。我将目的地和始发站存储在devicedict3中,然后为get请求发送的每个deviceid返回带有Counter的顶部元组(origin,destination)。

from flask import Flask, jsonify, abort
import csv
from flask import make_response
from collections import Counter
devicedict1 = collections.defaultdict(list)
devicedict3= collections.defaultdict(list)
mydict8 = []
with open('Salida1.csv', newline='', mode='r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    # rows1 = list(csv_reader)
    # print(len(rows1))
    line_count = 0
    count = 0
    for row in csv_reader:
        key = row[20]
        devicedict1[key].append(row)
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1

app = Flask(__name__)
@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'El usuario no ha dado su permiso para dar su ID y por lo tanto esta vacio el ID'}), 404)
@app.errorhandler(401)
def not_found(error):
    return make_response(jsonify({'error': 'El formato del  ID es incorrecto'}), 401)   

@app.route('/todo/api/v1.0/destinos/<string:destino>', methods=['GET'])
def get_destinos(destino):
count2 = len(devicedict1[destino])
            for i in range(0, count2):
                mydict8.append(devicedict1[destino][i])
            for i in range(0, len(mydict8)):
                devicedict3[i].append(mydict8[i][12])
                devicedict3[i].append( mydict8[i][13])
            n = 3
            return (str(Counter(map(tuple, devicedict3.values())).most_common(n)))
if __name__ == '__main__':
    app.run(port=50000, host='0.0.0.0')

所以当我这样做时,返回值应该是

curl -i http://10.3.4.38:50000/todo/api/v1.0/destinos/4ff70ad8e2e74f49
[(('3001', '1471'), 8), (('1471', '3001'), 5), (('3001', '1966'), 4)]

但是我第二次重复此操作,并且得到以下重复:

curl -i http://10.3.4.38:50000/todo/api/v1.0/destinos/4ff70ad8e2e74f49
[(('3001', '1471', '3001', '1471'), 8), (('3001', '1471'), 8), (('1471', '3001', '1471', '3001'), 5)]

每次查询服务器时,我都希望收到相同的答案,在第二次请愿中,我丢失了第三组值:

('3001', '1966')

1 个答案:

答案 0 :(得分:0)

在您的函数中,每次都会附加到相同的外部列表:

for i in range(0, count2):
    mydict8.append(devicedict1[destino][i])

for i in range(0, len(mydict8)):
    devicedict3[i].append(mydict8[i][12])
    devicedict3[i].append( mydict8[i][13])

这将修改应用程序的全局状态,这不是您想要的。而是在函数内部初始化列表并删除外部初始化:

def get_destinos(destino):
    # this is the same as the for loop with range above
    mydict8 = devicedict1[destino][0:count2])
    devicedict3 = collections.defaultdict(list)
    ...

我可能会选择比mydict8(这是一个列表...)和devicedict3更好的名称,因此它们代表了它们在函数中的实际含义。