Django rest framework: tutorial - Parte II

21/08/2017 | Autor: Eduardo Enriquez

En el post anterior habiamos resuelto la intalación de Django y de Django-Rest-Framework. También habiamos creado el proyecto y la app api. Ahora es momento de delegarle el manejo de un subgrupo de urls a mi app.

0. Creación de superusuario y creación de migraciones de base de datos:

Luego de tener instalado todo lo que necesitamos es necesario crear la base de datos (en este caso usamos el sqlite que viene por default) y pedirle a django que chequee si hubo alguno cambio en nuestro código que amerite un cambio en la base de datos (migración). Esto último se llama makemigrations, y efectuar el cambio se llama migrate. También es necesario crear un superusuario.

# Dentro de nuestra carpeta, donde está el manage.py
python manage.py makemigrations

# Corremos las migraciones
python manage.py migrate

# Creamos un superusuario
python manage.py createsuperuser

Una vez que tenemos todo esto podemos correr nuestro ambiente de desarrollo para ver que todo funciona bien.

python manage.py runserver

El runserver levanta un servidor de desarrollo en el puerto 8000 y está atento a los cambios del código ( pero no debe utilizarse para producción). Así que luego de correr dicho comando basta con ir a http://localhost:8000 para ver el servidor andando.

Cualquier duda, mandame un mail o un msj a traves de contacto y vemos que pasa.

 

1. Manejo de urls

Nuestro proyecto website, tiene un archivo de nombre urls.py. Este archivo es el dispatcher de las urls. Esto es todo pedido http que ingresa a nuestro django se resuelve primero en este archivo urls.py que tiene nuestro proyecto. Ahí le indicamos las directivas que tiene que realizar. Así django sabe que toda url (quitando el dominio) que comience con la palabra "admin" la va a manejar la app admin que viene con django (por eso el from django contrib import admin).

Y toda url que comience con la palabra "api" la va a manejar nuestra app api que creamos en el tutorial pasado.

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^api/$', include('api.urls'))),
    url(r'^admin/', include(admin.site.urls)),
]

Para que este pasamanos sea bien granular. Todo lo que empiece con la palabra api lo va a manejar el archivo urls de mi app api. Por esto es que aparece el 'api.urls'.

Pero cuando creamos una app con django el archivo urls.py no viene por default. Es algo que es optativo. Por esto debemos crear el archivo urls dentro de mi app api.

touch api/urls.py

Bueno vamos a editar dicho archivo y vamos a ubicar un manejo de usuarios. Usuarios y grupos ya vienen con django por default y por esto es un buen ejemplo para ver como funciona el manejo de urls.

from django.conf.urls import url

from rest_framework import routers

from . import views

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

urlpatterns += router.urls

Acá basicamente estamos usando el defaultRouter de rest-framework para manejar las urls de nuestra api y luego se lo apendeamos, lo agregamos al urlpatterns que habiamos modificado en nuestro urls.py de nuestro proyecto (docu oficial de routers de rest-framework).

Asi que si vamos a http://localhost:8000/admin vamos a ir al admin de django y nos logueamos con nuestro superuser:

Logueo con superuser

y si vamos a http://localhost:8000/api/users estaremos frente a la interfaz web que nos ofrece django rest framwork (si estamos logueados)

django rest framework

Django rest framework no trae una única manera de hacer las cosas. Por lo general, sigue el estilo de Django y trae cosas ya resueltas para los casos más comunes y trae cosas mas simples para que uno se encarge de toda la implementación (que por lo general se usa para cosas más complejas o más peculiares o especificas de nuestra necesidad).

En particular con las urls, podemos no usar un defaultRouter y usar como habiamos visto al principio:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'users/^', views.UserList.as_view(), name="user-list"),

]

 


Tags