С django-rest-framework я использую DefaultRouter
Я хочу предоставить API-интерфейсы нескольким приложениям, поэтому мой вопрос: могу ли я сделать это с помощью django и разместить регистрацию маршрутизаторов в каждом URL-адресе приложения и показать их как один агрегированный api или идеально в пространстве имен.
Другими словами, если app1
содержит modelA
и modelB
, а app2
содержит modelC
:
- Могу ли я объявить 2 маршрутизатора, которые появляются в
mysite/app1/api
иmysite/app2/api
, или - Могу ли я иметь один api в
mysite/api
, который перечисляет все три модели, но регистрирует отдельные модели в своем собственном приложенииurls.py
Что-то вроде
router = DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(include('app1.apis')
router.register(include('app2.apis')
В качестве альтернативы есть простой способ, с помощью которого моя переменная маршрутизатора может быть доступна в каждом URL-адресе приложения, чтобы они могли вызывать router.register
? Я не уверен, что
urlpatterns = patterns('',
url(r'^snippets/', include('snippets.urls', namespace="snippets"))
...
url(r'^api/', include(router.urls)),
действительно вызывает выполнение кода в app1/urls.py
в этой точке, чтобы он мог вызвать router.register
каким-то образом, так что окончательный URL-адрес включает в себя все регистрации приложений, а также один проект.
UPDATE
Используя вариацию на Nicolas Cortot option 2
, я получаю свой конкретный ресурс API
для работы, но он не указан в качестве доступного ресурса в root API
в myserver\api\
Я предполагаю, что каким-то образом DefaultRouter
создает собственное определение страницы, а router.register
добавляет к нему записи. Моя текущая настройка (и я думаю, что вариант Nicholas 1 также) создает два отдельных маршрутизатора, и только один может отображаться как корень сервера, с настройкой ниже, myserver\api\
перечисляет users
, но не фрагменты.
Здесь моя текущая настройка:
проект urls.py:
router = DefaultRouter()
router.register(r'users', views.UserViewSet)
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^api/', include(router.urls)),
url(r'^api/', include('snippets.apiurls')),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
)
Проект/сниппеты/apiurls.py:
router = DefaultRouter()
router.register(r'snippets', views.SnippetViewSet)
urlpatterns = patterns('',
url(r'^', include(router.urls)),
)
Если я отменил порядок записей в проекте urls.py
как:
url(r'^api/', include('snippets.apiurls')),
url(r'^api/', include(router.urls)),
тогда я получаю snippets
, но не users
Я думаю, Django выполняет первый сопоставленный маршрут.
Если кто-то не может сказать мне иначе, мне, похоже, нужна одна переменная маршрутизатора, которая должна быть передана и добавлена к каким-то образом.