Python - пишите несколько файлов JSON каждый раз, когда пользователь отправляет форму - PullRequest
0 голосов
/ 12 ноября 2018

Этот код записывает файл с именем vip.json. В настоящее время он перезаписывает один и тот же файл каждый раз, когда я отправляю форму. Но я хочу - каждый раз, когда я нажимаю на кнопку отправить в моей форме (которая встроена в колбу), я хочу, чтобы новые файлы создавались для каждой отправки. Что-то вроде - vip1.json, vip2.json, vip3.json и так далее каждый раз, когда форма отправляется.

from flask import Flask, render_template, url_for, flash, redirect, request, 
jsonify, json
from forms import RequestForm

@app.route("/home", methods=['POST'])
def home():
form = RequestForm()
employee_id = form.employee_id.data
email = form.email.data
network = form.network.data
app_name = form.app_name.data
vip_name = form.vip_name.data
pool_name = form.pool_name.data
pool_monitor = form.pool_monitor.data
pool_member = form.pool_member.data
load_balance = form.load_balance.data
ssl = form.ssl.data

data={}

data = {
    'Employee ID': employee_id,
    'Email': email,
    'Network': network,
    'App Name': app_name,
    'VIP Name': vip_name,
    'Pool name': pool_name,
    'Pool Monitor': pool_monitor,
    'Pool Member': pool_member,
    'Load Balancing Method': load_balance,
    'SSL': ssl
}

if form.validate_on_submit():
    with open("C:\\pytest\\vip.json",'w') as j:
        json.dump(data, j)

    return render_template ('home.html', title='Home', data=data, form=form, employee_id=employee_id, email=email, network=network, app_name=app_name, vip_name=vip_name, pool_name=pool_name, pool_monitor=pool_monitor, pool_member=pool_member, load_balance=load_balance, ssl=ssl)
else:
    return render_template('request.html', form=form)

Я посмотрел онлайн, но ничего полезного не смог получить. Каков будет лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы можете использовать glob для сканирования вашего каталога и получения списка всех ваших файлов json, получения файла с последней версией, а затем итерации по одному для нового имени файла:

import os
import glob

# Use glob to get a list of existing vip files.
dir = "C:/pytest/"
files = glob.glob(os.path.join(dir, "vip*.json")) # Let's say it returns ["C:/pytest/vip1.json", "C:/pytest/vip2.json", "C:/pytest/vip3.json"]

# Grab the latest vip file.
latest_file = sorted(files)[-1]

# Strip the path so it's just the file's name.
file_name = os.path.splitext(os.path.basename(latest_file))[0]

# Extract the number from the file's name.
num = int(file_name.lstrip("vip"))

# Generate your new path.
new_path = os.path.join(dir, "vip{}.json".format(num + 1))
# Output of new_path: C:/pytest/vip4.json

Вам может понадобиться дополнительная проверка ошибок, например, если num действительно число или нет существующих файлов, то по умолчанию num - 1, но я оставлю это вам.

0 голосов
/ 12 ноября 2018

Возможно, это не лучший способ сделать это, но вы можете добавить UUID (универсальный уникальный идентификатор), если вы сделаете это:

import uuid
if form.validate_on_submit():
    filename "vip-"+str(uuid.uuid4())+".json"
    with open("C:\\pytest\\"+filename,'w') as j:
        json.dump(data, j)

Вероятность столкновения очень мала, но вы всегда можете проверить, существует ли файл и сгенерировать другой, если он существует.

Если вы хотите сериализоваться, вы можете сделать это:

  • Хранение маринада с вашим количеством файлов
  • Сохранение текущего количества в базе данных
    • Я ничего не знаю о колбе или ORM, которые вы используете (если вы), поэтому я оставлю это на ваше усмотрение
  • Используя информацию из этого поста SO , чтобы получить список файлов и добавьте добавление 1 к len(list of files), чтобы получить свой счет (это предполагает, что в каталоге существуют только эти файлы)
  • Используйте тот же пост SO, чтобы получить список файлов, используйте RegEx, чтобы отфильтровать файлы, соответствующие вашему конкретному шаблону, затем добавьте 1 к наибольшему

Чтобы использовать подход pickle, перейдите в каталог, где находится ваш файл python, и запустите его один раз:

import pickle
counter=1;
with open("vip_counter.pickle", "wb") as p:
    pickle.dump(p, counter)

Это сохранит vip_counter.pickle в вашей файловой системе, где запускается скрипт , убедитесь, что файл pickle находится в правильном месте

Каждый раз перед выходом необходимо обновить файл таким же образом:

with open("vip_counter.pickle", "rb")as p:
    counter=pickle.load()
#counter is now loaded
counter+=1 #increment your counter before the new filesave
#your code here

#save your pickle back again :)
with open("vip_counter.pickle", "wb") as p:
    pickle.dump(p, counter)
...