Не удается загрузить / загрузить файл в FLASK / Python, «Не удается перейти на эту страницу» - PullRequest
0 голосов
/ 04 марта 2020

Я новичок в Flask - Это мое первое задание. Я пытаюсь реализовать простой API отдыха, используя Python Flask Framework. API должен быть в состоянии работать как автономный сервис на машинах Linux и быть доступным для инструментов командной строки (cURL, wget et c). Задача состоит в том, чтобы создать приложение, которое (A) получает файл CSV с координатами LONGITUDE / LATITUDE на адрес и (B) возвращает файл JSON, заполненный всеми возможными прямыми ссылками между каждой точкой, включая расстояние в метрах. Я справился с 1 и 2, но проблема возникает, когда мне нужно создать приложение на основе FLASK: Когда я запускаю свое приложение через мою подсказку Anaconda, происходит следующее:

  1. Я получаю шаблон страницы, с целью загрузки файла.

enter image description here

Я отправляю свой файл.

Загрузка не происходит (без сохранения в каталоге «upload») - переход на страницу «Не удается перейти на эту страницу» "окно в браузере.

enter image description here

Находясь в консоли: введите описание изображения здесь

Мое приложение папка / структура файла:

App/ [app.py, downloads/, uploads/, templates/upload.html]
import csv
import os
from math import sin, cos, sqrt, atan2, radians
from werkzeug import secure_filename
from flask import Flask, jsonify, request, render_template, flash, redirect, url_for, send_from_directory
import webbrowser

app = Flask(__name__, template_folder = 'templates')
app.secret_key = "secret key"
app.config['UPLOAD_FOLDER'] = os.path.dirname(os.path.abspath(__file__)) + '/uploads/'
DOWNLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/downloads/'
app.config['DOWNLOAD_FOLDER'] = DOWNLOAD_FOLDER
ALLOWED_EXTENSIONS = {'csv'}

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/')
def upload_form():
    return render_template('file_upload_form.html')

@app.route('/', methods=['GET', 'POST'])
def index():
   if request.method == 'POST':
       if 'file' not in request.files:
           print('No file attached in request')
           return redirect(request.url)
       file = request.files['file']
       if file.filename == '':
           print('No file selected')
           return redirect(request.url)
       if file and allowed_file(file.filename):
           filename = secure_filename(file.filename)
           file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
           process_file(os.path.join(app.config['UPLOAD_FOLDER'], filename))
           return redirect(url_for('uploaded_file', filename=filename))
   return render_template('index.html')

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    

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

@app.route('/uploads/<filename>')
def uploaded_file(filename):
   return send_from_directory(app.config['DOWNLOAD_FOLDER'], filename, as_attachment=True)



if __name__ == "__main__":
    webbrowser.open('http://localhost:5000')
    port = int(os.environ.get("PORT", 5000))
    app.run(host='127.0.0.1', port=port)
    app.run()            

И шаблон (загрузить. html):

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>CSV UPLOADER</title>
</head>
<body>
<div align="center">
   <h1>LONGITUDE/LATITUDE measurer</h1>
   <h2>Upload new File</h2>
   <form method=post enctype=multipart/form-data>
       <p><input type=file name=file>
           <input type=submit value=Upload>
   </form>
</div>
</body>
</html>

Заранее спасибо!

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