微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

请求呼叫问题在Django中发布

如何解决请求呼叫问题在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 举报,一经查实,本站将立刻删除。