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

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

Находясь в консоли: введите описание изображения здесь
Мое приложение папка / структура файла:
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>
Заранее спасибо!