Regis da Silva
Publicado em:

Tue 17 November 2015

←Home

Django Rest Framework Quickstart

Veremos aqui uma forma rápida de criar uma API REST com Django Rest Framework.

Este artigo foi atualizado em 14 de Fevereiro de 2018.

Este artigo está usando:

  • Python 3.5.2
  • Django 2.0.2
  • djangorestframework 3.7.7

Favor clonar o projeto do GitHub, favor ler o README para instalação.

Repare nas alterações das urls na nova versão do Django.

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

urlpatterns = [
    path('', include('core.urls')),
    path('admin/', admin.site.urls),
]
# core/urls.py
from django.urls import path
from core import views

urlpatterns = [
    path('persons/', views.person_list),
    path('persons/<int:pk>/', views.person_detail),
]

Além disso, tivemos alterações significativas em settings.py.

Obs: Tem coisas que é melhor nem traduzir. ;)

Obs: se você não sabe Django sugiro que leia este tutorial antes.

Começando

$ python3 -m venv .venv
$ source env/bin/activate
$ mkdir drf-quickstart
$ cd drf-quickstart
$ pip install django djangorestframework
$ pip freeze > requirements.txt
$ django-admin.py startproject myproject . # tem um ponto '.' aqui
$ python manage.py startapp core
$ python manage.py migrate
$ python manage.py createsuperuser  --username='admin' --email=''

Veja o meu requirements.txt

dj-database-url==0.4.2
Django==2.0.2
django-extensions==1.9.9
django-filter==1.1.0
djangorestframework==3.7.7
drf-nested-routers==0.90.0
python-decouple==3.1

Editando settings.py

Abra o arquivo settings.py e em INSTALLED_APPS acrescente

INSTALLED_APPS = (
    ...
    'rest_framework',
)

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'PAGE_SIZE': 10
}

Editando serializers.py

Crie o arquivo

$ cd core/
$ touch serializers.py

Edite

from django.contrib.auth.models import User, Group
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')


class GroupSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Group
        fields = ('url', 'name')

Editando views.py

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from core.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

Editando urls.py

from django.conf.urls import url, include
from rest_framework import routers
from core import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

Rodando a API

Abra duas abas no terminal, numa rode a aplicação.

$ python manage.py runserver

drf02

Na outra teste a API.

curl -H 'Accept: application/json; indent=4' -u admin:admin http://127.0.0.1:8000/users/

onde admin:admin equivale a username:password.

Experimente com httpie

http -a admin:admin http://127.0.0.1:8000/users/

Atenção: se você receber erro 301, muito provavelmente é porque você esqueceu da barra / no final da url.

drf01

Veja o código no GitHub.

Haverá continuação ...

Topo
comments powered by Disqus