PUT и POST только определенных полей без получения ошибки Serializer в django
Здесь я хотел разместить мои данные с сервера thingspeak в модели Django и я импортировал их, вызывая функции из файла DjangoApp.Thingspeak. Но, в этом коде GET и DELETE метод работает отлично, но, POST и PUT генерирует исключение ошибки, однако, это также занимает некоторое время для POST и PUT метода тоже. Но как только я повторно запускаю свой сервер. Он сразу же ловит значение. Может ли кто-нибудь помочь мне отладить это...
Вот мой код для views.py
import json
from django.views.decorators.csrf import csrf_exempt
from django.http.response import JsonResponse
from rest_framework.parsers import JSONParser
from DjangoApp.serializers import PatientSerializer
from DjangoApp.models import Patient
from DjangoApp.Thingspeak import tempValue,humValue,bodyTempValue
# Create your views here.
@csrf_exempt
def PatientAPI(request,id=0):
if request.method == 'GET':
patients = Patient.objects.all()
patients_serializer = PatientSerializer(patients,many=True)
return JsonResponse(patients_serializer.data,safe=False)
elif request.method == 'POST':
patient_data = JSONParser().parse(request)
patient = Patient.objects.create(PatientId=patient_data['PatientId'],PatientName=patient_data['PatientName'],RoomTemp=tempValue(),Humidity=humValue(),BodyTemp=bodyTempValue())
patient_data = json.parse(patient)
patients_serializer = PatientSerializer(data=patient_data)
if patients_serializer.is_valid():
patients_serializer.save()
return JsonResponse("Added Successfully", safe=False)
return JsonResponse("Failed to add", safe=False)
elif request.method == 'PUT':
patient_data = JSONParser().parse(request)
if patients_Serializer.is_valid():
patient=Patient.objects.filter(PatientId=patient_data['PatientId']).update(RoomTemp=tempValue(),Humidity=humValue(),BodyTemp=bodyTempValue())
patient = json.parse(patient)
patients_Serializer = PatientSerializer(patient, data=patient_data)
return JsonResponse("Updated Successfully", safe=False)
return JsonResponse("Failed to Update")
elif request.method == 'DELETE':
patient = Patient.objects.get(PatientId=id)
patient.delete()
return JsonResponse("Deleted Successfully", safe=False)
и код Thingspeak.py
import re
import urllib.request
with urllib.request.urlopen("https://api.thingspeak.com/channels/1633090/feeds/last.json?api_key=C15DPT91QNH37GY6&status=true") as url:
s = repr(url.read())
def tempValue():
temp = re.search('field1":"(.+?)",',s)
if temp:
return(temp.group(1))
def humValue():
hum = re.search('field2":"(.+?)",',s)
if hum:
return(hum.group(1))
def bodyTempValue():
bodyTemp = re.search('field3":"(.+?)",',s)
if bodyTemp:
return(bodyTemp.group(1))
Пожалуйста, не разбирайте JSON с помощью регексов: JSON - это рекурсивный язык, который не может быть разобран (правильно) с помощью регулярного выражения, поскольку JSON не является регулярным языком.
Но даже если вы разбираете только подчасти регексов, которые могут быть регулярным языком, язык намного сложнее, чем кажется на первый взгляд: существуют правила экранирования строк и т.д., поэтому даже если вам удастся захватить данные через регекс, будет сложно правильно их обработать.
Вы можете интерпретировать его как объект JSON, а затем получить доступ к значениям, связанным с ключом:
import requests
url = 'https://api.thingspeak.com/channels/1633090/feeds/last.json?api_key=C15DPT91QNH37GY6&status=true'
response = requests.get(url).json()
temp_value = response['field1']
hum_value = response['field2']
body_temp_value = response['field3']