я не могу понять, почему только delete_node не работает - PullRequest
0 голосов
/ 31 августа 2018

Это три запроса, которые вы получили от пользователя: create_node, rename_node работают нормально, но запрос delete_node не работает.

requests:
[31/Aug/2018 17:00:53] "GET /buildknowledge/?operation=create_node&id=1&text=New+node HTTP/1.1" 200 16071
[31/Aug/2018 17:01:10] "GET /buildknowledge/?operation=rename_node&id=63&text=pkkkk HTTP/1.1" 200 16071
[31/Aug/2018 17:02:33] "GET /buildknowledge/?operation=delete_node&id=63 HTTP/1.1" 200 16071

views.py:

def basetest(request):
     cu_id = request.user.id
     if 'operation' in request.GET and "id" in request.GET and "text" in request.GET:
       operation = request.GET['operation']
       pid=request.GET['id']
       nodename=request.GET['text']
       if "create_node" == operation:
          p=Buildkb4.objects.create    (parent=pid,created_by=cu_id,text=nodename)
          p.save()
       elif "delete_node" == operation:
           Buildkb4.objects.filter(pk=pid).delete()
       elif "rename_node" == operation:
           Buildkb4.objects.filter(pk=pid).update(text=nodename)
   return render(request,"registration/basetest.html")

1 Ответ

0 голосов
/ 31 августа 2018

Примечание : не - хорошая идея использовать GET-запросы для выполнения побочных эффектов (таких как обновление или удаление записей в базе данных). Поэтому я бы посоветовал изменить такие запросы на POST, DELETE или PATCH. Более подробная информация внизу этого поста.

На основании показанного вами журнала вызов удаления удаляется с двумя параметрами в строке запроса : operation и id. Но первый оператор if также требует параметр text:

def basetest(request):
     cu_id = request.user.id
     <b>if 'operation' in request.GET and "id" in request.GET and "text" in request.GET:</b>
       operation = request.GET['operation']
       pid=request.GET['id']
       nodename=request.GET['text']
       if "create_node" == operation:
          p=Buildkb4.objects.create    (parent=pid,created_by=cu_id,text=nodename)
          p.save()
       elif "delete_node" == operation:
           Buildkb4.objects.filter(pk=pid).delete()
       elif "rename_node" == operation:
           Buildkb4.objects.filter(pk=pid).update(text=nodename)
   return render(request,"registration/basetest.html")

Так что это никогда не дойдет до случая elif "delete_node" == operation:.

Вы можете исправить это, сделав проверку менее ограничительной, например:

def basetest(request):
     cu_id = request.user.id
     if 'operation' in request.GET and "id" in request.GET:
       operation = request.GET['operation']
       pid=request.GET['id']
       if "delete_node" == operation:
           Buildkb4.objects.filter(pk=pid).delete()
       elif 'text' in request.GET:
           nodename=request.GET['text']
           if "create_node" == operation:
               p=Buildkb4.objects.create(parent=pid,created_by=cu_id,text=nodename)
           elif "rename_node" == operation:
               Buildkb4.objects.filter(pk=pid).update(text=nodename)
   return render(request,"registration/basetest.html")

Теперь это будет работать. Но a GET должен иметь никаких побочных эффектов. Таким образом, вы в основном нарушаете контракт запросов GET.

Обычно удаление выполняется через запрос POST или DELETE, не запрос GET. Изменение данных также обрабатывается запросом POST или PATCH, опять же , а не запросом GET. Отправляя запросы GET с побочными эффектами, роботы (например, поисковые системы) могут запрашивать URL-адрес, а также удалять и / или обновлять ваши данные. Это, вероятно, не , что вы хотите.

...