#python #json #forms #dictionary #flask
Вопрос:
Я пишу код с помощью Python, JSON и flask, я создал функцию «make_user ():», чтобы брать данные из моей формы и вставлять их в словарь:
users_list = []
@app.route("/makeuser", methods=["post"])
def make_user():
firstname = f.request.form["firstname"]
lastname = f.request.form["lastname"]
username = f.request.form["username"]
password = f.request.form["pwd"]
mail = f.request.form["email"]
car = f.request.form["car"]
res = {
"firstname" : firstname,
"lastname" : lastname,
"username" : username,
"password" : password,
"mail" : mail,
"car" : car
}
Проблема возникает, когда я пытаюсь открыть свой файл json, затем добавить существующие словари в список пользователей, а затем добавить входные данные из формы, а затем сбросить новый список в файл json.
Это моя попытка:
file = open("users.json", "r ")
users_list.append(file)
for list_item in users_list:
users_list.append(res)
json.dump(users_list,file)
file.close
return redirect(url_for("form"))
то, что я хочу иметь в файле json, — это список со списком элементов в виде словарей, например: [{},{},{},{}]
Есть идеи, как это исправить?
Комментарии:
1. Содержит
users.json
только аdict
на верхнем уровне или это аlist
?
Ответ №1:
file = open("users.json", "r ")
users_list.append(file)
file
здесь не содержится содержимого users.json
. Это «дескриптор» открытого файла, из которого вы можете считывать данные или передавать json.load
их .
for list_item in users_list:
users_list.append(res)
Это немного бессмысленно. Предполагая, что вы правильно загрузили содержимое users.json
, это будет добавлено res
к каждому элементу. Мало того, что это не то, чего вы хотите, это невозможно, так как каждый элемент является диктатом.
Поскольку вы заменяете содержимое файла, вам нужно открыть его дважды: один раз для чтения и один раз для записи. Вы не можете добавить в файл, потому что это нарушит структурированный JSON. Попробуйте что-нибудь вроде этого:
with open("users.json") as file:
users_list = json.load(file)
users_list.append(res)
with open("users.json", "w") as file:
json.dump(users_list, file)
Комментарии:
1. здесь я получаю этот код ошибки с debug=True на: json.decoder.JSONDecodeError: Ожидаемое значение: строка 1 столбец 1 (символ 0)
2. Начните с
users.json
содержания только[]
3. Нииииисе! Теперь это работает!
Ответ №2:
Вам нужны load
данные из json
файла.
with open("users.json", "r") as file:
try:
users_list = json.load(file) # This should be your saved json structure
except json.decoder.JSONDecodeError: # in case your file does not contain valid json or is empty
users_list = []
if isinstance(users_list, dict): # this can be removed if your top level is a list
users_list = [users_list]
users_list.append(res) # append to the existing list
with open("users.json", "w") as file:
json.dump(users_list, file) # dump back to file
Допустим, это то, что есть в вашем файле.
{
"firstname" : "Martin",
"lastname" : "Mouse",
"username" : "mmouse",
"password" : "hunter9",
"mail" : "mmouse@dasney.com",
"car" : "Lambo"
}
json
Модуль имеет удобную функцию, которая считывает ваш файл из данных и анализирует его в объекты python за один шаг.
users_list = json.load(file)
По сути, это означает, что:
user_list = {
"firstname" : "Martin",
"lastname" : "Mouse",
"username" : "mmouse",
"password" : "hunter9",
"mail" : "mmouse@dasney.com",
"car" : "Lambo"
}
Следующий шаг состоит в том, чтобы убедиться, что ваш высший уровень list
-это а, и если нет, сделайте это так.
if isinstance(users_list, dict):
users_list = [users_list]
Итак, теперь ваша структура выглядит следующим образом.
[
{
"firstname" : "Martin",
"lastname" : "Mouse",
"username" : "mmouse",
"password" : "hunter9",
"mail" : "mmouse@dasney.com",
"car" : "Lambo"
}
]
На этом этапе вы можете добавить свою новую запись.
users_list.append(res)
Что и происходит сейчас.
[
{
"firstname" : "Martin",
"lastname" : "Mouse",
"username" : "mmouse",
"password" : "hunter9",
"mail" : "mmouse@dasney.com",
"car" : "Lambo"
},
{
"firstname" : "Darnold",
"lastname" : "Duck",
"username" : "dduck",
"password" : "hunter10",
"mail" : "dduck@dasney.com",
"car" : "Ferrari"
}
]
И, наконец, верните файл в файл.
with open("users.json", "w") as file:
json.dump(users_list, file) # dump back to file
Комментарии:
1. это работает, но это просто создает список рядом со списком, вот так: [{},{},{}][{},{},{}][{},{},{}]
2. я получаю сообщение об ошибке, в котором говорится, что проблема в следующем: users_list = json.load(файл) # Это должна быть ваша сохраненная структура json
3. Это произойдет, если то, что в вашем файле, недействительно
json
. Вы могли бы начать с[]
того, что предложил @Woodford.