如何解决请求呼叫问题在Django中发布
我正在进行POST
调用,以在on_message()
函数中添加事件,在该步骤中,URL是调用addEvent
函数(以添加事件),然后是有效载荷,其值由我定义(在mqtt_iot
文件内部)。
编译器不会进入addEvent
函数,它会锁定但不会发生任何错误(我正在使用终端)。
我附上代码。我该如何解决?
在mqtt_Iot.py
中:
def on_message(client,userdata,msg):
#convert byte json to json object and then to python dict to extract urls parameters
byte_payload = msg.payload
string_payload = byte_payload.decode('utf-8')
data_dict = json.loads(string_payload)
group_id = data_dict['group_id']
calendar_id = data_dict['calendar_id']
#in base al topic su cui ho ricevuto il messaggio faccio un azione o l'altra
if ( msg.topic == "event/update"):
#invio l'evento più prossimo alla board
client.publish(group_id,calendar_id)
elif ( msg.topic == "event/new"):
#il messaggio attiverà l'aggiunta di un evento facendo una post sul link adatto
url = 'http://127.0.0.1:8000/homeProva1/%d/calendars/%d/events/new/' % (group_id,calendar_id)
Now= datet.datetime.Now().time()
end_time = datet.datetime.Now() + datet.timedelta(hours=1)
end_time = end_time.strftime("%H:%M:%s")
Now = Now.strftime("%H:%M:%s")
dt = datet.datetime.today()
dt = dt.strftime("%Y-%m-%d")
title = "Evento Node"
description = "Evento prenotato in loco"
payload = {"title": title,"day": dt,"start_time": Now,"end_time": end_time,"notes":description}
print("Payload")
print(type(payload))
print(payload)
resp = requests.post(url,data=payload)
content= response.content
print (content)
在views.py
中:
def addEvent(request,pk=None,pk1=None):
print("sono dentro add event")
instance = Event()
instance = Event(calendar_id=pk1)
form = EventForm(request.POST or None,instance=instance)
if request.POST and form.is_valid():
print(form)
form.save()
print("form valido")
#controllo se evento appena aggiunto si svolgerà prima di un dato tempo ed in caso richiamo il publisher
e = Event.objects.filter(calendar=pk1).latest('id')
Now= datetime.Now().time()
#trasformo orari in int per poter sottrarre
Now= int(Now.strftime('%H%M%s'))
temp= int(e.start_time.strftime('%H%M%s'))
#se l'evento avviene fra meno di un ora chiamo la publish
if((temp-Now) < 6000):
publish(pk,pk1)
return HttpResponseRedirect(reverse('cal:home'))
return render(request,'cal/form.html',{'form': form})
在urls.py
中:
path('homeProva1/<int:pk>/calendars/<int:pk1>/events/new/',views.addEvent,name='event_newprova1'),
在models.py
中:
class Event(models.Model):
title = models.CharField(u'Title of the event',help_text=u'Title of the event',max_length=200,default='')
day = models.DateField(u'Day of the event',help_text=u'Day of the event')
start_time = models.TimeField(u'Starting time',help_text=u'Starting time')
end_time = models.TimeField(u'Final time',help_text=u'Final time')
notes = models.TextField(u'Textual Notes',help_text=u'Textual Notes',blank=True,null=True)
calendar = models.ForeignKey(Calendar,on_delete = models.CASCADE)
在forms.py
中:
class EventForm(ModelForm):
class Meta:
model = Event
fields = ('title','day','start_time','end_time','notes',)
解决方法
通过合并两个request.POST and form.is_valid()
,您将永远不会呈现经过验证的表单,如果它是无效的,那么您就永远不会看到错误。
您需要简化该视图中的逻辑,并确保包含错误的表单被返回到具有完整错误的页面;
def addEvent(request,pk=None,pk1=None):
print("sono dentro add event")
instance = Event()
instance = Event(calendar_id=pk1)
if request.method == "POST":
form = EventForm(request.POST or None,instance=instance)
if form.is_valid():
form.save()
print("form valido")
#controllo se evento appena aggiunto si svolgerà prima di un dato tempo ed in caso richiamo il publisher
e = Event.objects.filter(calendar=pk1).latest('id')
now= datetime.now().time()
#trasformo orari in int per poter sottrarre
now= int(now.strftime('%H%M%S'))
temp= int(e.start_time.strftime('%H%M%S'))
#se l'evento avviene fra meno di un ora chiamo la publish
if((temp-now) < 6000):
publish(pk,pk1)
return HttpResponseRedirect(reverse('cal:home'))
else:
# GET request
form = EventForm(instance=instance)
# An invalid POST request still hits here,where form contains errors
return render(request,'cal/form.html',{'form': form})
然后在模板中确保显示非字段错误以及字段错误;
<form method="post" action=''>
{% csrf_token %}
{% if form.non_field_errors %}
{{ form.non_field_errors }}
{% endif %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}
<button type="button" value="submit">Submit</button>
<button type="button" value="cancel">Cancel</button>
</form>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。