У меня есть следующее приложение Flask, которое представляет собой просто форму, в которую вы загружаете файл, выбираете из нескольких опций (переключателей), и скрипт python в бэкэнде обрабатывает загруженный файл для создания HTML.
В данный момент я загружаю этот загруженный файл, считывая его в память, а не сохраняя его локально (поскольку я буду развертывать это приложение в файловой системе только для чтения).Я обрабатываю этот потоковый файл в словарь через csv.DictReader(...)
, а затем превращаю его в объект JSON.Затем я хочу передать этот объект JSON в функцию AJAX в index.html
, чтобы мой скрипт Python внутреннего интерфейса мог обрабатывать файл JSON вместо локально сохраненного файла.
Вопрос: Как правильно передать структуру JSON в AJAX, а затем на конце AJAX, как передать объект JSON обратно на мой следующий маршрут Flask (upload_vals()
), где я пинаюот сценария Python?
main.py
@app.route('/process_file', methods=['POST'])
def process_file():
# Run checks on the file
if 'file' not in flask.request.files or not flask.request.files['file'].filename:
return flask.jsonify({'result':'False', 'message':'no files selected'})
return flask.redirect(url_for('home'))
file = flask.request.files['file']
filename = secure_filename(file.filename)
if not allowed_file(file.filename):
return flask.jsonify({'result':'False', 'message':'Must be TXT file!'})
return flask.redirect(url_for('home'))
# Convert streamed file contents to json object
contents_dict = csv.DictReader(file, delimiter='\t')
data = []
for line in contents_dict:
data.append(line)
json_data = json.dumps(data)
# Stream file and check that places exist
contents = csv.reader(file, delimiter='\t')
if not places_exist(contents):
return flask.jsonify({'result':'False', 'message':'There is an affiliation missing from your Place list. Please re-try.'})
return flask.redirect(url_for('home'))
flask.session['filename'] = filename
return flask.jsonify({'result':'True'})
return json_data # is this right?
index.html
<script>
$(document).ready(function(){
$('#TheForm').on('click', '.submit_data', function(){
var form_data = new FormData($('#myform')[0]);
var flag = true;
$.ajax({
type: 'POST',
url: '/process_file',
data: form_data,
contentType: false,
cache: false,
processData: false,
success: function(data) {
if (data.result === 'False'){
$('.error_message').html(data.message)
flag = false;
}
else {
var payload = {};
$('.form-radio').each(function(){
if ($(this).prop('checked')){
payload[$(this).data('key')] = $(this).data('value');
}
});
$.ajax({
url: "/upload_vals",
type: "get",
data: {'payload':JSON.stringify(payload)},
success: function(response) {
$(".my-results").html(response.data);
},
});
}
},
});
});
});
</script>