簡體   English   中英

Python-每次用戶提交表單時都寫入多個JSON文件

[英]Python - Write multiple JSON files each time user submits the form

這段代碼編寫了一個名為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)

我在網上看了一下,但沒有任何有用的信息。 最好的方法是什么?

這可能不是最佳方法,但是如果執行以下操作,則可以附加UUID(通用唯一IDentifier):

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帖子中的信息獲取文件列表,並向len(list of files)添加add 1以獲取計數(假設目錄中僅存在這些文件)
  • 使用相同的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)

您可以使用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確實是一個數字,或者如果沒有現有文件,則默認將num1 ,但我將留給您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM