image

Accede a bootcamps ilimitados y a más de 650 cursos

50
%OFF
Article image
Jose Araujo
Jose Araujo17/07/2024 15:32
Compartir

Trabalhando com Funções Assíncronas no Django

  • #Django
  • #Python
  • #REST

Trabalhando com Funções Assíncronas no Django

Introdução

O Django, um dos frameworks web mais populares em Python, tradicionalmente lida com operações de entrada e saída (I/O) de forma síncrona. No entanto, com o advento do Django 3.1, o suporte para funções assíncronas foi introduzido, permitindo que desenvolvedores lidem de maneira mais eficiente com operações de I/O, como chamadas de rede e consultas a banco de dados.

Benefícios da Programação Assíncrona

A programação assíncrona é especialmente útil em situações onde você precisa fazer muitas operações de I/O, como:

  • Consultas a APIs externas
  • Operações de leitura/escrita em bancos de dados
  • Processamento de grandes volumes de dados

A vantagem principal é a capacidade de não bloquear a execução enquanto espera por uma operação de I/O terminar. Isso pode resultar em uma melhoria significativa na performance e na escalabilidade de suas aplicações.

Configuração Inicial

Para começar a usar funções assíncronas no Django, certifique-se de que você está utilizando pelo menos a versão 3.1. Você pode instalar ou atualizar sua versão do Django usando:

pip install django>=3.1

Além disso, você precisará de um servidor ASGI (Asynchronous Server Gateway Interface) como o Daphne ou Uvicorn. Vamos usar o Uvicorn neste exemplo:

pip install uvicorn

Criando um Projeto Django

Vamos começar criando um novo projeto Django e uma aplicação:

django-admin startproject async_project 
cd async_project 
django-admin startapp async_app

Configuração do ASGI

No arquivo async_project/asgi.py, configure o ASGI para sua aplicação:

import os 
from django.core.asgi 
import get_asgi_application 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'async_project.settings') 
application = get_asgi_application()

Usando Funções Assíncronas no Django

No Django, você pode definir visualizações (views) assíncronas simplesmente utilizando a palavra-chave async def. Vamos criar uma visualização que faz uma chamada a uma API externa de forma assíncrona.

Definindo a View Assíncrona

No arquivo async_app/views.py:

import aiohttp
from django.http import JsonResponse
from django.views import View

class AsyncView(View):

  async def get(self, request):
      async with aiohttp.ClientSession() as session:
          async with session.get('https://api.github.com') as response:
              data = await response.json()
              return JsonResponse(data)

Configurando a URL

No arquivo async_app/urls.py:

from django.urls import path
from .views import AsyncView

urlpatterns = [
  path('async/', AsyncView.as_view(), name='async_view'),
]

E no arquivo async_project/urls.py, inclua a URL da aplicação async_app:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
  path('admin/', admin.site.urls),
  path('async_app/', include('async_app.urls')),
]

Configurando o Django REST Framework

Para demonstrar o uso de funções assíncronas com Django REST Framework, vamos criar um endpoint simples que retorna uma lista de itens de forma assíncrona.

Instalando o Django REST Framework

pip install djangorestframework

Configuração no settings.py

Adicione o Django REST Framework às INSTALLED_APPS:

INSTALLED_APPS = [
  ...
  'rest_framework',
]

Criando um Serializer e uma ViewSet

No arquivo async_app/serializers.py:

from rest_framework import serializers

class ItemSerializer(serializers.Serializer):
  id = serializers.IntegerField()
  name = serializers.CharField(max_length=100)

No arquivo async_app/views.py, adicione uma ViewSet assíncrona:

from rest_framework.viewsets import ViewSet
from rest_framework.response import Response

class AsyncItemViewSet(ViewSet):

  async def list(self, request):
      # Simulando uma operação assíncrona
      items = [
          {'id': 1, 'name': 'Item 1'},
          {'id': 2, 'name': 'Item 2'},
      ]
      return Response(items)

Configurando as URLs para o Django REST Framework

No arquivo async_app/urls.py:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import AsyncItemViewSet

router = DefaultRouter()
router.register(r'items', AsyncItemViewSet, basename='item')

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

Executando o Servidor ASGI

Para executar o servidor ASGI com Uvicorn, use o seguinte comando:

uvicorn async_project.asgi:application --reload

Conclusão

Neste artigo, vimos como configurar e utilizar funções assíncronas no Django, aproveitando o suporte nativo a operações assíncronas a partir da versão 3.1. Também demonstramos como integrar essas funcionalidades com o Django REST Framework, criando endpoints assíncronos para melhorar a eficiência e a performance de suas aplicações web.

Com o uso adequado de funções assíncronas, você pode desenvolver aplicações Django mais responsivas e escaláveis, prontas para lidar com operações intensivas de I/O de maneira mais eficiente.

Compartir
Comentarios (0)