首页 > 解决方案 > Flask 返回重复列表

问题描述

我有一个烧瓶应用程序后端(get),它返回一个计数器元素(列表)。当多次提交相同的请愿书时,它会不断添加每个元素。

flask get 返回应该只返回这个请求的值,而不是那些存储在某种本地内存中的值。Devicedict1 包含每个 id 的字段列表:目的地、原产地、售票价格、忠诚度计划等。Mydict8 包含每个 deviceid 的所有记录,出售给此 deviceID 的所有门票。例如 mydict8[2][12]- 包含本次购买的始发站,mydict8[3][12]- 包含本次购买的另一个始发站等。我将目的地和始发站存储在 devicedict3 中,然后为 get 请求发送的每个 deviceid 返回带有 Counter 的顶部元组(来源、目的地)。

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')

标签: pythonflaskduplicates

解决方案


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

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,所以它们代表了它们在你的函数中的实际含义。


推荐阅读