{"id":2112,"date":"2016-07-26T11:49:43","date_gmt":"2016-07-26T09:49:43","guid":{"rendered":"https:\/\/inlab.fib.upc.edu\/?p=2112"},"modified":"2016-07-26T11:49:43","modified_gmt":"2016-07-26T09:49:43","slug":"django-api-rest-2","status":"publish","type":"post","link":"https:\/\/inlab.fib.upc.edu\/es\/uncategorized-ca\/django-api-rest-2","title":{"rendered":"Django API REST"},"content":{"rendered":"<p>Una forma muy com\u00fan de obtener informaci\u00f3n de diferentes fuentes es mediante una <strong>API REST<\/strong>, que proporciona distintos <strong>API endpoints<\/strong> los cuales son accesibles con tal de conseguir unos datos determinados. <strong>Django REST&nbsp;Framework<\/strong> es un framework que nos permite el f\u00e1cil desarrollo de una API REST en <strong>Python<\/strong>. Actualmente esta tecnolog\u00eda se usa en diversos proyectos, como por ejemplo la API&nbsp;del <strong>Rac\u00f3<\/strong> o el proyecto <strong><a href=\"http:\/\/inlab.fib.upc.edu\/es\/uoc-index-usando-learning-analytics-para-medir-el-elearning\" target=\"_blank\" rel=\"noopener\">UOC \u00edndex<\/a><\/strong>.<\/p>\n<p><!--more--><\/p>\n<h2>Introducci\u00f3n<\/h2>\n<p>Una forma muy com\u00fan de obtener informaci\u00f3n de diferentes fuentes es mediante una <strong>API REST<\/strong>, que proporciona distintos <strong>API endpoints<\/strong> los cuales son accesibles con tal de conseguir unos datos determinados. <strong>Django REST Framework<\/strong> es un framework que nos permite el f\u00e1cil desarrollo de una API REST en <strong>Python<\/strong>. Actualmente esta tecnolog\u00eda se usa en diversos proyectos, como por ejemplo la API&nbsp;del <strong>Rac\u00f3<\/strong> o el proyecto <strong><a href=\"http:\/\/inlab.fib.upc.edu\/es\/uoc-index-usando-learning-analytics-para-medir-el-elearning\" target=\"_blank\" rel=\"noopener\">UOC \u00edndex<\/a><\/strong>.<\/p>\n<h2>Instalaci\u00f3n<\/h2>\n<p>Una buena pr\u00e1ctica es crear un <strong>entorno virtual<\/strong> con todo lo necesario para poder ejecutar la API REST creada con Django:<\/p>\n<pre class=\"brush:bash\">\r\n# Create the project directory\r\nmkdir tutorial\r\ncd tutorial\r\n# Create a virtualenv to isolate our package dependencies locally\r\nvirtualenv env\r\nsource env\/bin\/activate # On Windows use `env\\Scripts\\activate`\r\n<\/pre>\n<p>Una vez instalado el entorno, a\u00fan nos hace falta instalar las <strong>librer\u00edas<\/strong> necesarias de Python para poder usar Django:<\/p>\n<pre class=\"brush:bash\">\r\n# Install Django and Django REST framework into the virtualenv\r\npip install django\r\npip install djangorestframework\r\n# Set up a new project with a single application\r\ndjango-admin.py startproject tutorial . # Note the trailing '.' character\r\ncd tutorial\r\ndjango-admin.py startapp quickstart\r\n<\/pre>\n<p>Ahora ya lo tenemos todo a punto para empezar nuestro proyecto con Django.<\/p>\n<h2>Estructura del proyecto<\/h2>\n<p>Analizando lo que se ha creado dentro de la carpeta <code>tutorial<\/code> podemos ver como es la estructura de un proyecto con Django:<\/p>\n<ul>\n<li><code>env<\/code>: entorno virtual con las librer\u00edas instaladas y los ficheros necesarios para la correcta ejecuci\u00f3n del proyecto.<\/li>\n<li><code>tutorial<\/code>: carpeta donde podemos encontrar toda la configuraci\u00f3n del proyecto. Destacar <code>settings.py<\/code> y <code>urls.py<\/code>, ficheros que respectivamente controlan la configuraci\u00f3n del proyecto (aplicaciones instaladas, m\u00f3dulos que se pueden usar, tipos de bases de datos soportadas\u2026) y las urls disponibles.<\/li>\n<li><code>quickstart<\/code>: carpeta donde podemos encontrar la configuraci\u00f3n de la aplicaci\u00f3n quickstart del proyecto.<\/li>\n<li><code>manage.py<\/code>: ejecutable en Python que permite la puesta en marcha de la API.<\/li>\n<\/ul>\n<h2>Estructura de la aplicaci\u00f3n<\/h2>\n<p>Analizando lo que se ha creado dentro de la carpeta <code>quickstart<\/code> podemos ver como es la estructura de una aplicaci\u00f3n Django:<\/p>\n<ul>\n<li><code>models.py<\/code>: fichero con la informaci\u00f3n sobre los modelos de datos que usa nuestra aplicaci\u00f3n.<\/li>\n<li><code>views.py<\/code>: archivo que contiene todas las vistas empleadas por la aplicaci\u00f3n.<\/li>\n<li><code>tests.py<\/code>: fichero para desarrollar posibles tests para la aplicaci\u00f3n.<\/li>\n<li><code>migrations<\/code>: directorio encargado de detectar cambios en las bases de datos que usa la aplicaci\u00f3n.<\/li>\n<\/ul>\n<p>Es muy recomendable crear ficheros adicionales, especialmente estos dos:<\/p>\n<ul>\n<li><code>urls.py<\/code>: fichero con las posibles urls o endpoints de la API.<\/li>\n<li><code>queries.py<\/code>: archivo con las distintas llamadas a las bases de datos.<\/li>\n<\/ul>\n<h2>Tutorial<\/h2>\n<p>Una vez realizada la instalaci\u00f3n tal como se describe en el punto Instalaci\u00f3n, crearemos un nuevo endpoint para describir con m\u00e1s detalle c\u00f3mo funciona Django:<\/p>\n<ol>\n<li>Abrimos el archivo <code>tutorial\/tutorial\/settings.py<\/code> y a\u00f1adimos la lista INSTALLED_APPS \u2018rest_framework\u2019 y \u2018quickstart\u2019.<\/li>\n<li>Abrimos el archivo <code>tutorial\/tutorial\/urls.py<\/code> y a\u00f1adimos a la lista urlpatterns la siguiente url: url(r\u2019^quickstart\/\u2019, include(\u2018quickstart.urls\u2019)). Con este paso ya hemos hecho la configuraci\u00f3n b\u00e1sica de nuestra aplicaci\u00f3n quickstart.<\/li>\n<li>Ahora a\u00f1adiremos nuestras primeras vistas a <code>tutorial\/quickstart\/views.py<\/code>:\n<pre class=\"brush:bash\">\r\ndef index(request):\r\n    return HttpResponse(\"Hello, world. You're at the quickstartapp index.\")\r\nclass Example(APIView):\r\n\"\"\"\r\nReturns data from the football player Antoine Griezmann\r\n\"\"\"\r\n    def get(self, request):\r\n        data = {'Player': 'Antoine griezmann','Team': 'Atl\u00e9tico de Madrid', 'Age': 25}\r\n        return HttpResponse(json.dumps(data, indent=4, sort_keys=True), content_type=\"application\/json\")\r\n<\/pre>\n<\/li>\n<li>Vamos a <code>\/tutorial\/quickstart<\/code> y creamos el archivo <code>urls.py<\/code>:\n<pre class=\"brush:bash\">\r\nfrom django.conf.urls import url\r\nfrom . import views\r\nurlpatterns = [\r\n    url(r'^index\/', views.index, ),\r\n    url(r'^griezmann\/', views.Example.as_view(), name=\"'example'),\r\n]\r\n<\/pre>\n<\/li>\n<li>Vamos a <code>\/tutorial<\/code> y ejecutamos <code>python manage.py runserver<\/code> (por defecto se ejecuta en el puerto 8000) y comprobamos el funcionamiento de nuestro nuevo endpoint. Tendr\u00edamos que obtener un resultado llamando al endpoint http:\/\/localhost:8000\/quickstart\/griezmann\/ parecido a este:<br \/>\n\t{<br \/>\n\t\u00abAge\u00bb: 25,<br \/>\n\t\u00abPlayer\u00bb: \u00abAntoine Griezmann\u00bb,<br \/>\n\t\u00abTeam\u00bb: \u00abAtletico de Madrid\u00bb<br \/>\n\t}<\/li>\n<\/ol>\n<p>Esto es solo un peque\u00f1o ejemplo donde los datos son generados cada vez que se accede a la vista correspondiente. Creando un fichero queries.py, podr\u00edamos definir una manera m\u00e1s compleja de conseguir los datos, permitiendo que cada vez que se llamase a una determinada vista se fuesen a buscar los datos correspondientes a una base de datos determinada.<\/p>\n<h2>Para acabar<\/h2>\n<p>Hemos visto c\u00f3mo empezar a desarrollar una API REST&nbsp;con Django, que nos permite un desarrollo muy simple pero a la vez muy potente y f\u00e1cilmente escalable. Pod\u00e9is encontrar la documentaci\u00f3n oficial del framework en: <a href=\"http:\/\/www.django-rest-framework.org\/\" target=\"_blank\" rel=\"noopener\">http:\/\/www.django-rest-framework.org\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una forma muy com\u00fan de obtener informaci\u00f3n de diferentes fuentes es mediante una API REST, que proporciona distintos API endpoints los cuales son accesibles con tal de conseguir unos datos determinados. Django REST&nbsp;Framework es un framework que nos permite el f\u00e1cil desarrollo de una API REST en Python. Actualmente esta tecnolog\u00eda se usa en diversos [&hellip;]<\/p>\n","protected":false},"author":594,"featured_media":2108,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"experteses":[17,27],"class_list":["post-2112","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized-ca","experteses-entornosyserviciosticdesoportealaprendizaje-es","experteses-knowledgeyserviceengineering-es"],"acf":[],"_links":{"self":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/2112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/users\/594"}],"replies":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/comments?post=2112"}],"version-history":[{"count":0,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/posts\/2112\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media\/2108"}],"wp:attachment":[{"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/media?parent=2112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/categories?post=2112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/tags?post=2112"},{"taxonomy":"experteses","embeddable":true,"href":"https:\/\/inlab.fib.upc.edu\/es\/wp-json\/wp\/v2\/experteses?post=2112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}