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.