django - 在 django 中请求调用 Post 的问题
问题描述
我正在POST
调用在函数中添加事件,on_message()
其中 step 是调用addEvent
函数(添加事件)的 URL,然后是具有我定义的值的有效负载(在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>
推荐阅读
- python - Python 替换到 Azure SQL 数据库
- javascript - 将 queryParameters 与 Redux 状态同步并为功能组件做出反应路由器
- python - 如何只删除包含特定关键字的一行?并将该行保存到另一个文件中
- c# - 合并排序函数C#不排序
- php - 使用 PHP 计算数据库中每列值的出现次数
- java - 如何对字段错误列表和一组 ConstraintViolation 进行排序?
- php - 如何使php mvc动态url
- android - 如何创建双重关系房间
- postgresql - SQLAlchemy:如何正确转义 .update() 的文本
- python - python如何对treeview列中的所有数字求和