web-dev-qa-db-fra.com

Ajouter une APIView à Django REST Framework Browsable API

J'ai développé un REST backend avec le Django REST Framework).
Cependant, j'ai du mal à ajouter une instance APIView à l'API navigable Web.

documentation et réponse précédente suggère que tout ce que j'ai à faire est d'ajouter une docstring.
Cela n'a pas fonctionné pour moi.

Je suis sous l'hypothèse que l'API navigable affiche uniquement les points de terminaison de l'ensemble de vues sont enregistrés auprès du routeur.
Si tel est le cas, comment puis-je enregistrer des classes APIView sur le routeur?

Voici mon code de routeur actuel:

router = DefaultRouter(trailing_slash=False)
router.register(r'tokens', TokenViewSet, base_name='token')    
urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api/', include(router.urls)),
    url(r'^api/register$', RegisterUser.as_view(), name='register_user'),
    url(r'^api/auth$', ObtainAuthToken.as_view(), name='obtain_token'),
    url(r'^api/me$', ObtainProfile.as_view(), name='obtain_profile'),
    url(r'^api/recover$', FindUsername.as_view(), name='recover_username'),
)

Actuellement, seul le point de terminaison Token s'affiche.

Je vous remercie.

27
Jae

Les routeurs ne sont pas conçus pour des vues normales. Vous devez utiliser ViewSet si vous souhaitez enregistrer votre URL sur votre routeur.

J'ai la même question ici. Peut-être que vous pouvez le ref: Comment puis-je enregistrer une seule vue (pas un ensemble de vues) sur mon routeur?

13
flytofuture

Je crois que la ligne qui inclut le router.urls "préempte" les autres URL commençant par api. Essayez de changer,

url(r'^api/', include(router.urls)),

à

url(r'^tokenapi/', include(router.urls)),

Si cela fonctionne, essayez de déplacer la ligne avec include pour qu'elle soit la dernière ligne de la liste des modèles d'URL et de changer tokenapi en api.

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api/register$', RegisterUser.as_view(), name='register_user'),
    url(r'^api/auth$', ObtainAuthToken.as_view(), name='obtain_token'),
    url(r'^api/me$', ObtainProfile.as_view(), name='obtain_profile'),
    url(r'^api/recover$', FindUsername.as_view(), name='recover_username'),
    url(r'^api/', include(router.urls)),
)
2
nmgeek