django - Django Rest Framework - POST 请求调用 GET 请求(本地主机)
问题描述
当我尝试访问http://localhost:8000/api/articles/它工作正常。
当我尝试访问http://localhost:8000/api/articles/1它工作正常。
当我尝试访问http://localhost:8000/api/articles/create时,Django 认为我正在尝试执行 GET 请求('get': 'retrieve'
)。我究竟做错了什么?
错误 invalid literal for int() with base 10: 'create'
网址.py
urlpatterns = [
path('', ArticleViewSet.as_view({'get': 'list'}), name='list'),
path('<pk>/', ArticleViewSet.as_view({'get': 'retrieve'}), name='detail'),
path('create/', ArticleViewSet.as_view({'post': 'create'}) ,name='create'),
]
视图.py
class ArticleViewSet(ViewSet):
queryset = Article.objects.all()
def list(self, request):
articles = query_filter(request, ArticleViewSet.queryset)
serializer = ArticleSerializer(articles, many=True)
articles = formatter(serializer.data)
return Response(articles)
def retrieve(self, request, pk=None):
article = get_object_or_404(ArticleViewSet.queryset, pk=pk)
serializer = ArticleSerializer(article, many=False)
article = formatter([serializer.data])
return Response(article)
def create(self, request):
articles = ArticleViewSet.queryset
articles.create(title=request.data['title'], body=request.data['body'])
article = articles.last()
serializer = ArticleSerializer(article, many=False)
article = formatter([serializer.data])
return Response(article)
此外,当我在下面显示的 urlpatterns 中切换位置时,我收到此retrieve
错误。create
"detail": "Method \"GET\" not allowed."
urlpatterns = [
path('', ArticleViewSet.as_view({'get': 'list'}), name='list'),
path('create/', ArticleViewSet.as_view({'post': 'create'}), name='create'),
path('<pk>/', ArticleViewSet.as_view({'get': 'retrieve'}), name='detail'),
]
解决方案
当您尝试使用 时http://localhost:8000/api/articles/create
,您实际上是在发出GET请求。这就是您看到错误("detail": "Method \"GET\" not allowed.".
)的原因。如果要发出 post 请求,则需要使用 postman 之类的 api工具。如果您使用邮递员,请尝试这样:
你的第二个网址模式是正确的。因为如果你保留<pk>/
before ,当你实际调用 create 方法时create/
,django 会解释你正在调用<pk>/
(应该是<int:pk>
)带有参数的 url (这是一个字符串)。create
当它试图将其转换为整数时(因为主键是一个自动字段),它会抛出invalid literal for int() with base 10: 'create'
异常。
推荐阅读
- php - laravel 广播多后卫
- android - 尝试在空对象引用上调用虚拟方法“void android.graphics.Canvas.drawText()”
- jpeg - What is the "n" parameter in the JPEG spec's DQT segment?
- android - 从 Play 控制台中删除应用
- java - 处理来自 Bean 类的线程“main”java.lang.NullPointerException 中的异常的最佳实践
- c++ - 读取文本文件,C++
- node.js - Multer 不会以任何方式将图像保存在磁盘上
- python - Path handling error calling Windows Python from within WSL
- java - Shim 客户端 java 链码 Hyperledger Fabric 1.1
- python - DLL Load failed error when installing opencv for Python 3.6.3 on Windows 10