drf - 在调用 post api 时尾随 / in url 抛出错误
drf - trailing / in url throwing error while calling post api
views.py
class FurnitureViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
permission_classes = [AllowAny]
serializer_class = FurnitureSerializer
queryset = Furniture.objects.all()
@nested_view_set(FurnitureViewSet, 'furniture_id')
class TablesViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
permission_classes = [AllowAny]
serializer_class = TableSerializer
queryset = Table.objects.all()
class OrdersViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, GenericViewSet):
authentication_classes = []
permission_classes = [AllowAny]
queryset = Orders.objects.all()
urls.py
router = ExtendedSimpleRouter()
furniture_router = router.register('furnitures', FurnitureViewSet, basename='furnitures')
furniture_router.register('tables', TablesViewSet, basename="tables",parents_query_lookups=['furniture_id'])
order_router = router.register('orders', OrdersViewSet, basename="orders")
urlpatterns = [
path('', include(router.urls)),
]
我在我的项目中为第三方集成创建了几个 api。
家具和桌子 api 从他们的测试门户调用时工作正常。
Order post api 被调用为 someurl.url/orders 抛出 500 错误。
You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to someurl.url/orders/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.
apis 正在被另一个组织访问并通过他们的门户进行测试,因此我无法更改结构,也无法更改整个项目的设置 3 api秒。由于我使用的是嵌套视图集,如何在仍然使用 ExtendedSimpleRouter 的同时解决 url 问题?
将 URL 更改为 someurl.url/orders/
并重试,或者在您的设置文件中添加 APPEND_SLASH=False
。
我在 urls.py
中使用 re_path 解决了这个问题
router = ExtendedSimpleRouter()
furniture_router = router.register('furnitures', FurnitureViewSet, basename='furnitures')
furniture_router.register('tables', TablesViewSet, basename="tables",parents_query_lookups=['furniture_id'])
urlpatterns = [
path('', include(router.urls)),
re_path(r'^orders/?$', OrdersViewSet.as_view({
'post': 'create'
}), name="orders-list"),
path('orders/<id>', OrdersViewSet.as_view({
'patch': 'partial_update',
}), name="order-detail")
]
views.py
class FurnitureViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
permission_classes = [AllowAny]
serializer_class = FurnitureSerializer
queryset = Furniture.objects.all()
@nested_view_set(FurnitureViewSet, 'furniture_id')
class TablesViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
permission_classes = [AllowAny]
serializer_class = TableSerializer
queryset = Table.objects.all()
class OrdersViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, GenericViewSet):
authentication_classes = []
permission_classes = [AllowAny]
queryset = Orders.objects.all()
urls.py
router = ExtendedSimpleRouter()
furniture_router = router.register('furnitures', FurnitureViewSet, basename='furnitures')
furniture_router.register('tables', TablesViewSet, basename="tables",parents_query_lookups=['furniture_id'])
order_router = router.register('orders', OrdersViewSet, basename="orders")
urlpatterns = [
path('', include(router.urls)),
]
我在我的项目中为第三方集成创建了几个 api。
家具和桌子 api 从他们的测试门户调用时工作正常。
Order post api 被调用为 someurl.url/orders 抛出 500 错误。
You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to someurl.url/orders/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.
apis 正在被另一个组织访问并通过他们的门户进行测试,因此我无法更改结构,也无法更改整个项目的设置 3 api秒。由于我使用的是嵌套视图集,如何在仍然使用 ExtendedSimpleRouter 的同时解决 url 问题?
将 URL 更改为 someurl.url/orders/
并重试,或者在您的设置文件中添加 APPEND_SLASH=False
。
我在 urls.py
中使用 re_path 解决了这个问题router = ExtendedSimpleRouter()
furniture_router = router.register('furnitures', FurnitureViewSet, basename='furnitures')
furniture_router.register('tables', TablesViewSet, basename="tables",parents_query_lookups=['furniture_id'])
urlpatterns = [
path('', include(router.urls)),
re_path(r'^orders/?$', OrdersViewSet.as_view({
'post': 'create'
}), name="orders-list"),
path('orders/<id>', OrdersViewSet.as_view({
'patch': 'partial_update',
}), name="order-detail")
]