Колба возвращает дубликаты списков - PullRequest
0 голосов
/ 06 июня 2019

У меня есть серверная часть приложения get (get), которая возвращает элемент счетчика (список).При подаче несколько раз одной и той же петиции он продолжает добавлять каждый элемент.

Функция возврата колбы должна возвращать только значения для этой петиции, а не те, которые хранятся в какой-либо локальной памяти.Devicedict1 содержит для каждого идентификатора список полей: пункт назначения, источник, цена проданного билета, программа лояльности и т. Д.Mydict8 содержит для всех записей каждого deviceid все билеты, проданные на этот deviceID.например, mydict8 [2] [12] - содержит станцию ​​отправления для этой покупки, mydict8 [3] [12] - содержит другую станцию ​​отправления для этой покупки и т. д.Затем я сохраняю станцию ​​назначения и отправления в devicedict3, возвращая верхние кортежи (источник, назначение) со счетчиком для каждого идентификатора устройства, отправленного запросом get.

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 голосов
/ 06 июня 2019

В вашей функции вы добавляете к одним и тем же внешним спискам каждый раз:

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, так что они представляют то, что они на самом деле означают внутри вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...