Python-每次用户提交表单时都写入多个JSON文件

时间:2018-11-12 04:00:47

标签: python python-3.x flask-wtforms wtforms wtforms-json

此代码写入一个名为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 :(得分:1)

这可能不是最好的方法,但是如果执行以下操作,则可以附加一个UUID(通用唯一IDentifier):

users.sort(Ordering
        .explicit(1, 0, 5)
        .onResultOf(User::getStatus)
        .thenComparing(User::getUsername));

发生冲突的可能性非常低,但是您始终可以check if the file exists并生成另一个。

如果要序列化,可以通过以下方式实现:

  • 存储具有您的文件计数的泡菜
  • 将当前计数存储在数据库中
    • 对于您使用的烧瓶或ORM,我一无所知,所以我会把它留给您
  • 使用this SO post中的信息来获取文件列表,并将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) 添加到1中以获取计数(假设目录中仅存在这些文件)< / li>
  • 使用相同的SO帖子获取文件列表,使用len(list of files)过滤出与您的特定模式匹配的文件,然后在最高的位置加1

要使用pickle方法,请转到python文件所在的目录,然后运行一次:

RegEx

这会将import pickle counter=1; with open("vip_counter.pickle", "wb") as p: pickle.dump(p, counter) 存储在运行脚本的文件系统中。确保泡菜文件位于正确的位置

每次退出之前,您都需要以相同的方式更新文件:

vip_counter.pickle

答案 1 :(得分:1)

您可以使用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,但我将其保留为你。