Django Rest Framework传Slug时触发@api_view AssertionError求助
解决DRF中URL传递slug时的AssertionError问题
错误原因
你遇到的AssertionError: @api_view expected a list of strings, received str,是因为@api_view装饰器要求传入HTTP请求方法的列表或元组,而你直接传了单个字符串'GET',不符合参数格式要求。
修复方案
1. 修正@api_view的参数格式
把views.py中的@api_view('GET')改为@api_view(['GET']),用列表包裹HTTP方法字符串:
from rest_framework.decorators import api_view from rest_framework.response import Response from .models import Blog from .serializers import BlogSerializer from django.shortcuts import get_object_or_404 @api_view(['GET']) def blog(request): blog = Blog.objects.all() serializer = BlogSerializer(blog, many=True ) return Response(serializer.data) @api_view(['GET']) def blogPost(request, slug): # 用get_object_or_404替代get,slug不存在时自动返回404响应 blogpost = get_object_or_404(Blog, slug=slug) serializer = BlogSerializer(blogpost, many=False) return Response(serializer.data)
2. 优化URL路径转换器(可选)
在urls.py中,推荐使用Django专门的slug路径转换器代替str,更贴合slug字段的语义:
from django.urls import path from . import views urlpatterns = [ path('blog/', views.blog, name='blog'), # 末尾加/,保持URL规范 path('blog/<slug:slug>/', views.blogPost, name='blogpost') ]
额外优化建议
- 第一个
blog视图必须加上@api_view(['GET'])装饰器,确保DRF的Response组件能正常工作,避免潜在兼容性问题。 - 使用
get_object_or_404替代直接调用Blog.objects.get(),无需手动捕获DoesNotExist异常,代码更简洁,返回的404响应也更符合REST规范。
内容的提问来源于stack exchange,提问作者Mumin Bhat
相关产品推荐
相关产品推荐

