2
respostas

Acesso a funções ou métodos externos.

Olá, boa noite.

Vi que os códigos python estão nos arquivos utilizados pelo Django para utilização do framework. No caso views/urls/models/etc. Não sei se estou entendendo bem, mas de uma maneira bem simplificada para que me faça entender, utilizamos um banco de dados, manipulando as informações nas páginas (renderizando-as) . A aplicação basicamente funciona assim.

Supondo que precise consumir um serviço de um servidor web, recebendo de retorno um arquivo json com as informações que serao utilizadas. Nesse exemplo, teria que executar um código python externo, com classes e objetos próprios. Por exemplo, vou utilizar o servidor web dos correios para consumir um método que me retorna o prazo em dias, enviando dois números de CEP e o tipo de serviço a ser utilizado. Minha pagina web terá um formulário em que preencho CEP1(70.000-000), CEP2(20.000-000), SEDEX. Esses valores serão enviados a um método de uma classe em um arquivo python especifico. Como poderia implementar isso?

Obrigado. Att. Rangel.

2 respostas

Oiii Rangel, como você está? Espero que esteja tudo bem por ai ^-^

Sinto muito pela demora em obter um retorno.

Vou fazer passo a passo com você explicando o porquê de cada procedimento, tá bom? E se ficar alguma dúvida no meio do caminho, fique a vontade para perguntar =) Vamos lá:

  • Como exemplo, vamos utilizar a API de CEPs, a viacep. A estrutura dessa API é a seguinte:

URL: https://viacep.com.br/ws/01001000/json/

Retorno da URL:

{
  "cep": "01001-000",
  "logradouro": "Praça da Sé",
  "complemento": "lado ímpar",
  "bairro": "Sé",
  "localidade": "São Paulo",
  "uf": "SP",
  "ibge": "3550308",
  "gia": "1004",
  "ddd": "11",
  "siafi": "7107"
}

O objetivo é preencher no formulário o número CEP e utilizar uma função python responsável por buscar os dados do CEP preenchido no formulário, onde iremos substituir na URL o cep enviado pelo formulário.

Imgur

  • Quanto ao código HTML desse formulário, estou utilizando o mesmo exemplo utilizado neste curso, do projeto de receitas, porém, com algumas adaptações:
{% extends 'base.html' %}
{% load static %}
{% block content %}
<div class="contact-area section-padding-0-80 mt-5">
    <div class="container">
        <div class="row">
            <div class="col-12">
                <div class="section-heading">
                    <h2>Requisição a API</h2>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-12">
                <div class="contact-form-area">
                    <form action="{% url 'requisicao_api' %}" method="POST">
                        {% csrf_token %}
                        <div class="row">
                            <div class="col-12 col-lg-12">
                                <label for="cep"><b>CEP</b></label>
                                <input id="cep" type="text" class="form-control" name="cep" placeholder="Ex: 01001000" required>
                            </div>
                            <div class="col-12 text-center">
                                <button class="btn btn-success" type="submit">Buscar</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
{% endblock %}

Observe no código acima que no atributo action do form é redirecionado para a url de requisicao_api. Vamos cadastrar essa url no arquivo urls.py:

from django.urls import path

from django.contrib.auth import views as auth_views

from . import views

urlpatterns = [
    path('requisicao_api', views.requisicao_api, name='requisicao_api'),
    ... outras urls omitidas
]

De posse da url cadastrada, vamos escrever nossa função responsável por retornar os dados da API de acordo com o cep preenchido no formulário. Em nosso arquivo views.py vamos criar essa função: requisicao_api:

def requisicao_api(request):
    if request.method == 'POST':
        cep = request.POST['cep']
        response = requests.get(f'https://viacep.com.br/ws/{cep}/json/')
        if response.status_code == 200:
            dados = response.json()
            return render(request, 'cep.html', {"dados": dados})

    return redirect('cadastro')

Na primeira linha verificamos se o método da requisição quando enviamos o formulário é do tipo POST, que nada mais é do que um método utilizado quando precisamos enviar algum dado. E logo após isso, pegamos o dado enviado, que no caso é o atributo name do nosso formulário html, nesse caso, esse atributo possui o name de cep.

Agora que capturamos o dado que precisamos, basta passá-lo para a função responsável por fazer a requisição, que é a requests.get. Em caso de sucesso (código 200), pegamos o formato json desses dados e redirecionamos para uma página responsável por nos mostrar aqueles dados, a cep.html. E caso o método não seja do tipo POST, iremos apenas permanecer na mesma página através do redirect.

Continua...

O código HTML para mostrar os dados ficará da seguinte forma:

{% extends 'base.html' %}
{% load static %}
{% block content %}
<div class="contact-area section-padding-0-80 mt-5">
    <div class="container">
        <div class="row">
            <div class="col-12">
                <div class="section-heading">
                    <h2>Requisição a API</h2>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-12">
                <div class="contact-form-area">
                        <div class="row">
                            <div class="col-12 col-lg-12">
                                <label for="nome_receita"><b>DADOS DO CEP: {{ dados.cep }}</b></label>
                                <p> Localicadade: {{ dados.localidade }}
                                <p> Estado: {{ dados.uf }}
                                <p> IBGE: {{ dados.ibge }}
                            </div>
                            <div class="col-12 text-center">
                                <button class="btn btn-success" type="submit" onclick="location.href='/usuarios/cadastro'">Pesquisar novamente</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
{% endblock %}

Lembra da estrutura dos dados da API? Observe que no código acima acessamos os valores retornados da API com base na chave, por exemplo: localidade, uf, ibge, bairro, etc. O resultado é similar a imagem mostrada abaixo:

Imgur

Por fim, e não menos importante, para fazer essas requisições precisamos instalar a biblioteca requests responsável por fazer a requisição a URL e capturar os dados. Abra o terminal e digite:

pip install requests

Com isso, conseguimos fazer o consumo de um serviço web através do Django.

Qualquer dúvida é só falar, tá bom? Estou por aqui.

Grande abraço!