#python #json #server #client
#python #json #сервер #клиент
Вопрос:
Я пытаюсь настроить простой сервер python для чтения и хранения входящих пользовательских данных из запроса POST клиента. Клиент отправляет данные в формате Json, и я хочу, чтобы сервер добавил эту информацию в существующий файл userDataBase.json.
Клиентский код:
import os
import sys
import json
import requests
userData = {}
userData.update({
'email':'bob@&mail.com',
'password':'12345',
'payment_ref' : 'a34fqw4'
})
# userData = json.dumps(userData)
print(userData)
url = "<address&&t;:4758/"
response = requests.post(url,json=userData)
Серверный код
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import os
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
with open('&ameData.json') as file:
self.wfile.write(file.read().encode())
def do_POST(self):
self.data_strin& = self.rfile.read(int(self.headers['Content-Len&th']))
self.send_response(200)
self.end_headers()
data = self.data_strin&.decode()
if os.path.isfile('userDataBase.json') == False:
print('Makin& New File')
userData = {}
userData["users"] = []
with open('userDataBase.json','w') as outfile:
json.dump(userData,outfile)
print('Appendin& userDataBase File')
with open('userDataBase.json','r') as file:
userData = json.load(file)
userData["users"].append(data)
print(userData)
with open('userDataBase.json','w') as file:
json.dump(userData,file,indent=4)
print('Stated Server Listenin& on Port 4758...')
httpd = HTTPServer(('', 4758), SimpleHTTPRequestHandler)
httpd.serve_forever()
Это почти работает, но результат выглядит следующим образом:
ubuntu@address:~$ cat userDataBase.json
{
"users": [
"{"email": "jeff@&mail.com", "password": "12345", "payment_ref": "a34fqw4"}",
"{"email": "bob@&mail.com", "password": "12345", "payment_ref": "a34fqw4"}"
]
}
Но я хочу, чтобы это выглядело так:
{
"users": [
{"email": "jeff@&mail.com", "password": "12345", "payment_ref": "a34fqw4"},
{"email": "bob@&mail.com", "password": "12345", "payment_ref": "a34fqw4"}
]
}
Я прочитал и думаю, что проблема связана с тем фактом, что я дважды кодирую входящие данные Json. Но, похоже, я не могу решить свою проблему.
Комментарии:
1.
import json; {"users" : [json.loads(x) for x in userData["users"]]}
?2. @Sushanth, я думаю, проблема в том, что я сохраняю файл. Потому что то, что я сохраняю, уже в формате Json. Итак, если я использую json.dump() объект json, то он в конечном итоге получает двойное кодирование. Я попытался сохранить в виде строки, но это тоже не сработало. Проблема, которую я вижу в вашем решении, заключается в том, что я просто получаю другой объект json, который необходимо сохранить без двойного кодирования.
3. РЕШЕНО!! ОК, @Sushanth, я думаю, у тебя была правильная идея. И это заставило меня задуматься. Мне действительно нужно использовать json.loads(). Но я делаю это сразу после «data = self.data_strin&.decode()». На этом этапе «данные» представляют собой строку и должны быть объектом Json. Итак, я создал следующую строку «data = json.loads (данные)» . И теперь это работает
4. Я думаю, проблема была не в двойном кодировании.