मेरे पास एक फ्लास्क एप्लिकेशन बैकएंड (प्राप्त) है जो काउंटर तत्व (सूची) देता है। एक ही पिटीशन को कई बार सबमिट करने पर यह हर एक एलीमेंट को जोड़ता रहता है।

फ्लास्क गेट रिटर्न को केवल इस याचिका के लिए मान लौटाना चाहिए, न कि स्थानीय मेमोरी में संग्रहीत। Devicedict1 में प्रत्येक आईडी के लिए फ़ील्ड की एक सूची होती है: गंतव्य, मूल, बेचे गए टिकट की कीमत, लॉयल्टी प्रोग्राम, आदि। Mydict8 में प्रत्येक डिवाइस आईडी के सभी रिकॉर्ड के लिए, इस डिवाइस आईडी को बेचे गए सभी टिकट शामिल हैं। उदाहरण के लिए mydict8 [२] [१२] - इस खरीद के लिए मूल स्टेशन शामिल है, mydict8 [३] [१२] - इस खरीद-आदि के लिए एक और मूल स्टेशन है। मैं गंतव्य और मूल स्टेशन को डिवाइसडिक्ट 3 में संग्रहीत करता हूं, एक अनुरोध प्राप्त करके भेजे गए प्रत्येक डिवाइसिड के लिए काउंटर के साथ शीर्ष टुपल्स (मूल, गंतव्य) लौटाता हूं।

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')
-2
AndresRuizDeElv 6 जून 2019, 10:47

1 उत्तर

सबसे बढ़िया उत्तर

अपने फ़ंक्शन में आप हर बार उसी, बाहरी सूचियों में शामिल होते हैं:

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 से बेहतर नाम चुनूंगा, इसलिए वे आपके फ़ंक्शन के अंदर वास्तव में उनका मतलब दर्शाते हैं।

0
MatsLindh 6 जून 2019, 08:01