django restframwork put and DELETE 不起作用



Get和post工作对我来说很好。但是使用"U_repo_name"在表格中查找我得到了错误信息:

页面未找到(404)请求方法:PUT请求URL: http://localhost:8000/gitapi/repo/authoo/使用gitit中定义的url配置。Django尝试了以下URL模式,顺序如下:

管理/gitapi/[name = ' gitapi ']gitapi/回购/gitapi/回购/str: U_repo_name

这是我的模型:

class UserRepos(models.Model):
U_repo_name =models.CharField( max_length=50)

这是我的url:

urlpatterns = [
path('repo/',view=userreposapi),
path('repo/<str:U_repo_name>',view=userreposapi),
]

项目url:

urlpatterns = [
path('admin/', admin.site.urls),
path('gitapi/',include('gitapi.urls')),
]

这是我的序列化器:

class UserReposSerializer(serializers.ModelSerializer):
class Meta:
model = UserRepos
fields ='__all__'

,这是我的观点:

@csrf_exempt
def userreposapi(request,id=0):
if request.method=='GET':
userrepos = UserRepos.objects.all()
userreposserializer = UserReposSerializer(userrepos , many=True)
return JsonResponse(userreposserializer.data , safe=False)
elif request.method=='POST':
userrepos_data=JSONParser().parse(request)
userreposerializer = UserReposSerializer(data=userrepos_data)
if userreposerializer.is_valid():
userreposerializer.save()
return JsonResponse("added successfully!!",safe=False)
return JsonResponse("failed to add",safe=False)

elif request.method=='Put':
userrepos_data=JSONParser().parse(request)
userrepos = UserRepos.objects.get(U_repo_name=userrepos_data['U_repo_name'])
userreposserializer=UserReposSerializer(userrepos,data=userrepos_data)
if userreposserializer.is_valid():
userreposserializer.save()
return JsonResponse("updated successfully", safe=False)
return JsonResponse("failed to update",safe=False)

elif request.method=='DELETE':
userrepos = UserRepos.objects.all()
userrepos.delete()
return JsonResponse("deleted",safe=False)

大家好!我发现你的代码中有一些问题可能会导致这个问题。

  1. request.method总是大写的,所以你应该使用字符串'PUT'而不是这一行的'Put':

    elif request.method=='Put':
    
  2. 当你试图访问它时,你正在添加一个尾斜杠到你的路由(/gitapi/repo/authoro/)),但是在urlpatterns中设置的模式没有这个尾斜杠:

    path('repo/<str:U_repo_name>',view=userreposapi),
    

    您可以使用re_path()而不是path()来设置一个regex URL模式,无论您是否添加尾斜杠都可以工作:

    re_path(r'repo/(?P<U_repo_name>w+)/?', view=userreposapi),
    

    (?P<U_repo_name>w+)创建一个名为U_repo_name的命名组,该组匹配任何单词字符([a-zA-Z0-9_])从一次到多次。/?匹配单个可选的/

  3. 您的路由'repo/<str:U_repo_name>'捕获变量U_repo_name中的字符串。这个变量作为关键字参数提供给视图userreposapi(),但是视图目前只接受idkwarg。您应该添加U_repo_namekwarg作为可选参数,或者使用**kwargs使视图接受其他关键字参数:

    # Both are valid:
    def userreposapi(request, id=0, U_repo_name=None):
    ...
    def userreposapi(request, id=0, **kwargs):
    ...
    

修复这三个问题应该可以使路由正常运行。

我认为url中的尾斜杠是问题所在。我不应该在那里。

http://localhost:8000/gitapi/repo/authoo  # here I removed the trailing slash.

相关内容

  • 没有找到相关文章

最新更新