Как добавить два списка словарей в jsonify? - PullRequest
0 голосов
/ 04 марта 2020

У меня 2 списка словарей в коде приложения FLASK. Я хотел бы вернуть ответ типа JSON с содержимым двух списков. Я пытаюсь вычислить расстояния между двумя местоположениями по их свойствам LONGITUDE / LATITUDE из входного CSV-файла и ответить файлом типа JSON, заполненным результатами. Ниже приведена обработка и POST часть приложения. Когда я запускаю его - я получаю TypeError : unhashable type: 'list' в последней строке - return jsonify({points : points, links : links}).

#@app.route("/get_address", methods = ['POST']) 
def process_file(points):

    def upload_file():
        if request.method == 'POST':
          points = request.files['file']
          points.save(secure_filename(points.filename))
          return points

    def calculate_distance(lat1, lon1, lat2, lon2):
        # approximate radius of earth in mm
        radius = 6371.0 * 1000 
        dlat = radians(lat2-lat1)
        dlon = radians(lon2-lon1)
        a = sin(dlat/2) * sin(dlat/2) + cos(radians(lat1)) \
            * cos(radians(lat2)) * sin(dlon/2) * sin(dlon/2)
        c = 2 * atan2(sqrt(a), sqrt(1-a))
        d = radius * c
        return d    

    points = upload_file()

    with open(points, newline='') as csvfile:
      reader = csv.DictReader(csvfile)
      points = []
      links = []
      for row in reader:  
        p = {"name": list(row.items())[0][1], "address (La/Lo)": (list(row.items())[1][1], list(row.items())[2][1])}    
        points.append(p) 

    l = []
    for point in points:
        for v in point.values():
            l.append(v)

    links = []
    for i in range(0, len(l) -1 , 2):    
        if(i>0):
            for j in range(i-2, 0, -2):
                    links.append({'name': l[i] + l[j], 'distance': calculate_distance(float(l[i+1][0]), float(l[i+1][1]), float(l[j+1][0]), float(l[j+1][1]))})
        else:
            for j in range(i+2, len(l), 2):
                    links.append({'name': l[i] + l[j], 'distance': calculate_distance(float(l[i+1][0]), float(l[i+1][1]), float(l[j+1][0]), float(l[j+1][1]))})

    return jsonify({points : points, links : links})  

1 Ответ

1 голос
/ 04 марта 2020

Ключи должны быть строками:

return jsonify({"points": points, "links": links})  

{points : points, links : links} было бы правильным в Javascript.

В качестве альтернативы вы можете сделать надикт со строковыми ключами, например так:

dict(points=points, links=links)  

Согласно jsonify документам , вы можете сделать это напрямую:

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