web-dev-qa-db-fra.com

Ajout de REST à Django

J'ai une application Django qui fonctionne bien. J'ajoute des services REST. Je recherche des entrées supplémentaires sur mon REST.

Voici quelques exemples de choses que je tends la main.

  • En ce moment, j'utilise l'API Django-REST avec une pile de correctifs.
  • Je pense à revenir à simplement écrire des fonctions de vue dans Django qui retournent des résultats JSON.
  • Je peux également voir filtrer les demandes REST dans Apache et les acheminer vers une instance de serveur distincte, non Django.

Veuillez nommer une approche par réponse afin que nous puissions voter pour ou contre.

50
S.Lott

Je pense à revenir à simplement écrire des fonctions de vue dans Django qui retournent des résultats JSON.

  • Explicite
  • Portable sur d'autres frameworks
  • Ne nécessite pas de patcher Django
59
Ali Afshar

Veuillez noter que REST ne signifie pas seulement les résultats JSON. REST signifie essentiellement exposer une API orientée ressources sur HTTP natif mais à part entière. Je ne suis pas un expert sur REST, mais voici quelques-unes des choses Rails fait.

  • Les URL doivent être de bons noms simples pour les ressources
  • Utilisez les bonnes méthodes HTTP
    • HEAD, GET, POST, PUT et DELETE
    • Facultativement avec un remplacement (le paramètre de formulaire '_method' remplacera la méthode de demande HTTP)
  • Prise en charge de la négociation de type de contenu via Accepter l'en-tête de demande
    • Facultativement avec un remplacement (l'extension du nom de fichier dans l'URL remplacera le type MIME dans l'en-tête de demande Accept)
    • Les types de contenu disponibles doivent inclure XML, XHTML, HTML, JSON, YAML et bien d'autres selon le cas

Par exemple, pour obtenir la prise en charge native de HTTP, le serveur doit répondre à

GET /account/profile HTTP/1.1
Host: example.com
Accept: application/json

car il répondrait à

GET /account/profile.json HTTP/1.1
Host: example.com

Et il devrait répondre à

PUT /account/profile HTTP/1.1
Host: example.com

var=value

car il répondrait à

POST /account/profile HTTP/1.1
Host: example.com

_method=PUT&var=value
30
yfeldblum

Pour tous ceux qui recherchent une application API très décente et enfichable pour Django, assurez-vous de vérifier Django-piston de jespern qui est utilisé en interne sur BitBucket.

Il est bien entretenu, a un excellent suivi et des fourchettes sympas qui font des choses comme ajouter la prise en charge de la pagination et d'autres méthodes d'authentification (OAuth est pris en charge hors de la boîte).

Mis à jour pour refléter que le piston Django n'est plus maintenu.

25
oliland

Tastypie est également un nouveau framework REST pour Django. Il a le même état d'esprit que les pistons et supprime beaucoup de codage standard).

7
RickyA

Ma réponse à la même question ici: Framework for Implementation REST web service in Django

La version courte est, jetez un oeil à https://github.com/jgorset/Django-respite/ a REST framework à ses débuts, mais nous utilisons tous les jours sur des projets clients.

5
espenhogbakk

Scrap the Django REST api and come up with your open open project that others can contribution to. Je serais prêt à contribuer. J'ai du code qui est basé sur les formulaires api pour faire REST.

4
Sam Corder

Je pense à revenir à simplement écrire des fonctions de vue dans Django qui retournent des résultats JSON.

J'irais avec ça ..
ALi A l'a assez bien résumé.

Le point principal pour moi est beign explicit. J'éviterais d'utiliser une fonction qui convertit automatiquement un objet en json, que faire si l'objet a une référence à un utilisateur et que le mot de passe (même s'il est haché) va dans le snippit json?

3
hasen

Vous pouvez jeter un œil à Django-dynamicresponse , qui est un cadre léger pour ajouter REST avec JSON à vos applications Django).

Il nécessite des modifications minimes pour ajouter la prise en charge de l'API aux applications Django existantes), et facilite la création d'API dès le début dans de nouveaux projets.

Fondamentalement, il inclut la prise en charge du middleware pour analyser JSON dans request.POST, en plus de sérialiser le contexte renvoyé en JSON ou de rendre un modèle/redirection conditionnellement en fonction du type de demande.

2
chrismi

J'ai fini par utiliser mon propre REST API pour Django (dont j'aimerais me débarrasser si je peux trouver une alternative viable)), avec quelques vues personnalisées pour les cas d'angle que je ne voulais pas traiter.

Donc, une combinaison de 1 et 2; sans une certaine forme de cadre, vous finirez par écrire le même passe-partout pour les cas courants.

J'ai également réalisé quelques API autonomes. J'aime les avoir en tant que services autonomes, mais le fait même qu'ils soient indépendants du reste du code les amène à être négligés. Aucune raison technique; simplement hors de vue, hors de l'esprit.

Ce que j'aimerais vraiment voir, c'est une approche qui unifie Django formulaires et REST APIs, car ils partagent souvent beaucoup de logique. Conceptuellement, si votre application expose quelque chose en HTML qu'il souhaite probablement également exposer par programme.

2
Parand

vous pouvez essayer de créer des fonctions génériques qui traitent les données (comme parand mentionné) que vous pouvez appeler à partir des vues qui génèrent les pages Web, ainsi que celles qui génèrent le json/xml/que ce soit

1
Jiaaro

TastyPie semble assez intéressant et prometteur. Ça va bien avec Django.

1
Cody