Article image
Jose Araujo
Jose Araujo17/07/2024 15:32
Compartilhe

Trabalhando com Funções Assíncronas no Django

    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.

    Compartilhe
    Comentários (0)