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(通用唯一标识符):
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)
发生冲突的概率很低,但您总是可以check if the file exists,如果发生冲突,再生成一个。
如果要连载,可以通过:
- 存储具有您的文件数的 pickle
- 将当前计数存储在数据库中
- 我对 flask 或您正在使用的 ORM 一无所知(如果您使用的话),所以我会把它留给您
- 使用 this SO post 中的信息获取文件列表并将添加
1
添加到 len(list of files)
以获取计数(假设目录中仅存在这些文件)
- 使用相同的 SO post 获取文件列表,使用
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
确实是一个数字,或者如果没有现有文件则将 num
默认为 1
,但我会离开对你来说。
此代码写入一个名为 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(通用唯一标识符):
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)
发生冲突的概率很低,但您总是可以check if the file exists,如果发生冲突,再生成一个。
如果要连载,可以通过:
- 存储具有您的文件数的 pickle
- 将当前计数存储在数据库中
- 我对 flask 或您正在使用的 ORM 一无所知(如果您使用的话),所以我会把它留给您
- 使用 this SO post 中的信息获取文件列表并将添加
1
添加到len(list of files)
以获取计数(假设目录中仅存在这些文件) - 使用相同的 SO post 获取文件列表,使用
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
确实是一个数字,或者如果没有现有文件则将 num
默认为 1
,但我会离开对你来说。