我无法理解,为什么只有delete_node无法正常工作

问题描述 投票:1回答:1

这三个请求geeting从用户有以下,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.朋友:

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")
python django jstree
1个回答
0
投票

注意:使用GET请求执行副作用(如更新或删除数据库中的记录)不是一个好主意。因此,我建议将此类请求更改为POST,DELETE或PATCH。本文底部的更多信息。

根据您显示的日志,删除调用在查询字符串中附带两个参数:operationid。但是第一个if语句也需要一个text参数:

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")

所以这永远不会达到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")

现在它会起作用。但GET应该没有副作用。所以你基本上违反了GET请求的合同。

通常,删除是通过POST或DELETE请求执行的,而不是通过GET请求执行的。更改数据也由POST或PATCH请求处理,同样不是GET请求。通过使GET请求产生副作用,机器人(如搜索引擎)可以查询URL,删除和/或更新数据。这可能不是你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.