5 votes

Comment utiliser le client coreapi avec le django rest framework ?

J'ai intégré le django rest framework version 3.10 dans un projet django 2.2 existant, en plaçant l'api Root à l'emplacement suivant /api .

J'essaie maintenant d'utiliser le client coreapi cli pour télécharger des documents sur le serveur.

$ coreapi get http://localhost:8000/openapi
<DownloadedFile '/root/.coreapi/downloads/openapi (4)', open 'rb'>
$ coreapi get http://localhost:8000/api
{
    "invoices": "http://localhost:8000/api/invoices/"
}
$ coreapi action invoices list
Index ['invoices']['list'] did not reference a link. Key 'invoices' was not found.

/openapi est un point de terminaison qui génère un schéma à la demande et retourne

openapi: 3.0.2
info:
  title: Orka
  version: TODO
  description: API for orka project
paths:
  /invoices/:
    get:
      operationId: ListInvoices
      parameters: []
      responses:
        '200':
          content:
            application/json:
              schema:
                required:
                - file_name
                - original_file_name
                properties:
                  file_name:
                    type: string
                  original_file_name:
                    type: string
                    maxLength: 80
                  upload_date:
                    type: string
                    format: date-time
                    readOnly: true
                  data:
                    type: object
                    nullable: true
                  confidence:
                    type: number
                  user_verified:
                    type: boolean
  /invoices/{id}/:
    get:
      operationId: retrieveInvoice
      parameters:
      - name: id
        in: path
        required: true
        description: A unique integer value identifying this Invoice.
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                required:
                - file_name
                - original_file_name
                properties:
                  file_name:
                    type: string
                  original_file_name:
                    type: string
                    maxLength: 80
                  upload_date:
                    type: string
                    format: date-time
                    readOnly: true
                  data:
                    type: object
                    nullable: true
                  confidence:
                    type: number
                  user_verified:
                    type: boolean

Il n'existe pas de chemin compliqué pour les factures (même s'il devrait être /api/invoices ).

J'ai réussi à faire fonctionner coreapi avec des apis externes, donc cela semble être un problème avec la façon dont je configure mes urls et/ou vues.

Les deux sont très simples.

# urls.py
from rest_framework import routers

from . import views

router = routers.DefaultRouter()
router.register(r'invoices', views.InvoiceViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
]

# views.py
# ... imports ...

class InvoiceSerializer(serializers.HyperlinkedModelSerializer):
    """Defines API representation of invoices"""

    class Meta:  # pylint:disable=too-few-public-methods, missing-docstring
        model = Invoice
        fields = (
            'file_name',
            'original_file_name',
            'upload_date',
            'data',
            'confidence',
            'user_verified',
        )

class InvoiceViewSet(viewsets.ModelViewSet):
    """Defines api views for invoices"""
    # default permissions are set in settings.py
    parser_classes = (JSONParser, XMLParser, FormParser, MultiPartParser)
    queryset = Invoice.objects.all()
    serializer_class = InvoiceSerializer

    @action(methods=['post'], detail=True)
    def upload_with_ground_truth_file(self, request, pk):
        pass

Il semble que je manque quelque chose de flagrant. Que dois-je configurer pour pouvoir utiliser le client coreapi pour consommer mon api ?

4voto

jg435 Points 21

J'ai rencontré la même erreur : python 3.8.5, Django 3.1, DRF 3.12.1. La similitude pour moi était que coreapi renvoie un DownloadedFile au lieu d'un Document ce qui semble se produire lorsque coreapi reçoit un type de contenu qu'il n'attend pas.

Pour moi, la solution était :

  1. pip install openapi-codec (si vous ne l'avez pas encore installé)
  2. coreapi get http://localhost:8000/openapi?format=openapi-json --format=openapi

Vous saurez qu'il a réussi parce que vous ne verrez aucune mention de DownloadedFile Il s'agit plutôt d'un résumé des tags/actions disponibles.

Je ne vois pas pourquoi il faudrait forcer le format.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X