Documentação do Django API Client

O Django API Client é um wrapper de resposta da API, que traduz as chamadas nativas do Django ao usar uma view para a uma determinada API REST.Seja usando do cliente da API diretamente em um FBV (Function-based View) ou usando CBV (Class-based View), essa biblioteca tornar essa comunicação o mais transparente e fácil o possível

Alguns motivos para se usar o Django API Client

  • Se você trabalha com microsserviços com APIs em vários locais e deseja continuar usando o Django como um WebApp com os mesmos recursos para renderizar os dados como se estivesse usando os modelos nativos

  • Você quer separar o seu projeto Django para deixar um deles somente com a API com DRF e outro como um WebApp com Templates(HTML), CSS, JS ao invés de usar algum frontend JS (ReactJS, AngularJS, etc)

  • Você deseja usar uma API de terceiros para listar, criar e alterar usando o sistema de templates do django

Exemplo

  • Adicione esta configuração no seu projeto no arquivo settings.py para acessar a sua API

DJANGO_API_CLIENT = {
    'API': [
      {
          'NAME': 'production',
          'BASE_URL': 'https://example.com/v1',
          'ENDPOINTS': [
              '/order/orders',
              '/user/users',
              ...
          ],
          'AUTHENTICATION_ACCESS_TOKEN': 'TOKEN'
      },
      {
          'NAME': 'localhost',
          'BASE_URL': 'http://localhost:8001/v1',
          'ENDPOINTS': [
              '/order/orders',
              '/user/users',
              ...
          ],
          'AUTHENTICATION_ACCESS_TOKEN': 'TOKEN'
      }
    ]
}

Dica

Os detalhes da configuração serão melhor explicados na documentação*

  • Crie um arquivo clients.py em alguma pasta nucleo do seu projeto, caso não tenha, crie dentro da sua pasta do projeto para ficar mais simples de ser importado de qualquer lugar do projeto com o seguinte conteúdo:

from django_api_client.client import api_client_factory

api_client = api_client_factory('production')

Dica

  • O nome dessa variável será o nome do cliente que será importado para cada projeto

  • It is recommended that the name comes from a constant in the settings.py file, and if possible it can even be an environment variable.

  • É recomendável que o nome venha de uma constante no arquivo settings.py, e se possível ser até uma variável de ambiente

  • Agora vamos listar os dados usando o sistema padrão do Django

Vamos imaginar que o cliente esta em uma pasta dentro da pasta do projeto (pasta que contém o arquivo settings.py)

from django_api_client.mixins import ClientAPIListMixin

from pasta_do_projeto.clients import api_client


class OrderListView(ClientAPIListMixin):
    template_name = "template_name.html"        # Path where is your template
    page_title = 'Orders'                       # Generates a context variable to use in your template
    page_base_url = reverse_lazy('order:list')  # Information used in pagination, and the search
    paginate_by = 50                            # Number of items to generate the pagination
    client_method = api_client.order.orders.list

Nota

O cliente irá gerar uma estrutura amigavel para cada endpoing. Exemplo com o endpoint /order/orders/:

No seu template você pode usar os snippets de formulários e de paginação. Ex:

{% content %}

...
<div class="card card-navy card-outline">
  <div class="card-header">
    <h3 class="card-title">
      {% trans "Order List" %} : <small class="text-muted">{{ paginator.count }}</small>
    </h3>
    {% include "includes/form_paginate_by.html" with paginate_by=paginate_by range_pagination=range_pagination %}
    {% include "includes/form_search.html" with search=search %}
  </div>
  <div class="card-body table-responsive p-0">
    <table class="table table-bordered table-hover table-striped" id="list-content">
      <thead>
      <tr>
        <th>{% trans 'Code' %}</th>
        <th>{% trans 'Customer' %}</th>
        <th>{% trans 'Product' %}</th>
      </tr>
      </thead>
      <tbody class="text-gray">
      {% for order in object_list %}
        <tr>
          <td><a href="{% url 'order:detail' pk=order.id %}" </a>
          </td>
          <td>{{ order.id }}</td>
          <td>{{ order.customer.name|title }}</td>
          <td>{{ order.product.name|title }}</td>
        </tr>
        {% endfor %}
      {% endif %}
      </tbody>
    </table>
  </div>
  <div class="card-footer">
    {% if object_list|length != 0 or not object_list %}
      {% include "includes/list_paginator.html" with page_obj=page_obj paginator=paginator %}
    {% endif %}
  </div>
</div>

Nota

  • Exemplo usando estilos (CSS) do Bootstrap

  • includes/form_search.html: Formulário com input de busca. Este include suporta placeholder tambem.

  • includes/form_paginate_by.html: Formulario de Select para escolher com quantos elementos a pagina será paginadaEx: por (20, 40, 60, etc …)

  • includes/list_paginator.html: Bloco com os elementos de paginação com os butões de número de paginas, anterior e proximo

endpoint name: order
methods:
     - list   # GET: List
     - get    # GET: Detail of a resource using an identifier
     - create # POST: Create a resource record
     - update # PUT / PATCH: Fully or partially updates a resource using an identifier
     - delete # DELETE: delete a record in a resource using an identifier

Dica

O que isso quer dizer?

Que o API Cliente sempre gerará a estutura de acordo os nomes dos seus endpoints

Downloads