Как развернуть URL в формате namespace:view:endpoint?
У меня есть проект Django со следующим urlpattern, определенным на уровне проекта:
urlpatterns = [
path('', include(('ws_shopify.urls', 'ws_shopify'), namespace='shopify')),
]
В файле ws_shopify.urls
определены следующие url-шаблоны:
urlpatterns = [
path('api/shopify/', ShopifyWebhookAPIView.as_view(), name='webhook'),
]
Класс ShopifyWebhookAPIView
определяет следующую конечную точку:
from rest_framework.views import APIView
class ShopifyWebhookAPIView(APIView):
@action(detail=False, methods=['post'], url_path='(?P<webshop_name>.+)/order_created', name='order-created')
def order_created(self, request: Request, webshop_name=None):
return Response({'message': f'Order created for {webshop_name}'})
Мой вопрос таков:
Какое правильное имя этой конечной точки будет использоваться в тестовом примере, использующем reverse()
?
Я пробую это сейчас:
class WebhookTestCase(TestCase):
def test_that_url_resolves(self):
url = reverse('shopify:webhook:order-created', kwargs={'webshop_name': 'my-shop'})
self.assertEqual(url, '/api/shopify/my-shop/order_created')
Но это не удается со следующим сообщением об ошибке:
django.urls.exceptions.NoReverseMatch: 'webhook' is not a registered namespace inside 'shopify'
Не уверен, что это уместно или нет, вот как выглядит ws_shopify.apps
:
from django.apps import AppConfig
class ShopifyConfig(AppConfig):
name = 'ws_shopify'
Я заставил его работать со следующими изменениями:
В ws_shopify.urls
:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from ws_shopify.views import ShopifyWebhookViewSet
router = DefaultRouter()
router.register(r'', ShopifyWebhookViewSet, basename='webhook')
urlpatterns = [
path('api/shopify/', include(router.urls)),
]
В ws_shopify.views
:
from rest_framework.viewsets import ViewSet
class ShopifyWebhookViewSet(ViewSet):
@action(detail=False, methods=['post'], url_path='(?P<webshop_name>.+)/order_created', name='order-created')
def order_created(self, request: Request, webshop_name=None):
return Response({'message': f'Order created for {webshop_name}'})
В ws_shopify.tests_views
:
class WebhookTestCase(TestCase):
def test_that_url_resolves(self):
url = reverse('shopify:webhook-order-created', kwargs={'webshop_name': 'my-shop'})
self.assertEqual(url, '/api/shopify/my-shop/order_created/')