{"id":590,"date":"2019-08-18T14:46:23","date_gmt":"2019-08-18T12:46:23","guid":{"rendered":"https:\/\/tiraquelibras.com\/blog\/?p=590"},"modified":"2019-12-26T17:00:42","modified_gmt":"2019-12-26T16:00:42","slug":"flask-entornos-virtuales-venv-y-apache-en-centos7","status":"publish","type":"post","link":"https:\/\/blog.tiraquelibras.com\/?p=590","title":{"rendered":"Flask, entornos virtuales VENV y Apache en Centos7"},"content":{"rendered":"<p>Recientemente he estado trabajando en c\u00f3mo integrar el <strong><em>Framework<\/em><\/strong> de <em><strong>Python<\/strong> <\/em><a href=\"https:\/\/flask.palletsprojects.com\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\"><em><strong>Flask<\/strong><\/em><\/a> con un servidor web corriendo bajo <a href=\"https:\/\/www.centos.org\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\"><em><strong>Centos7<\/strong><\/em><\/a> y as\u00ed poder tenerlo siempre disponible con las ventajas que ofrecen este tipo de soluciones. Para esta ocasi\u00f3n el servidor web escogido fue <a href=\"https:\/\/httpd.apache.org\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\"><em><strong>Apache<\/strong><\/em><\/a>.<\/p>\n<p>No fue una tarea f\u00e1cil, pero finalmente consegu\u00ed hacerlo funcionar, y el resultado quer\u00eda compartirlo con la comunidad por si le pudiera servir de ayuda a alguien.<\/p>\n<p><strong><em>Flask<\/em> <\/strong>es un <em>Framework<\/em> minimalista de Python destinado a la creaci\u00f3n de aplicaciones web y API Rest con muy pocas l\u00edneas de c\u00f3digo. Al decir que es minimalista nos referimos a que en comparaci\u00f3n a otros <em>Frameworks<\/em>, como <em><strong><a href=\"https:\/\/www.djangoproject.com\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">Django<\/a><\/strong><\/em>, no dispone de todos los m\u00f3dulos aunque s\u00ed se podr\u00e1 complementar con librer\u00edas de terceros que ofrezcan las funcionalidades de las que carece. Est\u00e1 basado en la especificaci\u00f3n\u00a0<a class=\"new external external_icon\" title=\"WSGI (a\u00fan no redactado)\" href=\"https:\/\/es.wikipedia.org\/w\/index.php?title=WSGI&amp;action=edit&amp;redlink=1\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">WSGI<\/a>\u00a0de Werkzeug y el motor de templates Jinja2 y tiene una\u00a0<a title=\"Licencia BSD\" href=\"https:\/\/es.wikipedia.org\/wiki\/Licencia_BSD\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">licencia BSD<\/a>. Sus ventajas son much\u00edsimas, por lo que te animo a que investigues un poco m\u00e1s sobre este interesante <strong><em>Framework<\/em><\/strong>.<\/p>\n<p>Los entornos virtuales de <em><strong>Python<\/strong><\/em> nos van a permitir crear estancias aisladas en donde podremos instalar y usar librer\u00edas sin que afecte a la instalaci\u00f3n global o a otros entornos virtuales creados. Es una gran forma de probar librer\u00edas en diferentes desarrollos y evitar incompatibilidades entre estas o ante la necesidad de usar versiones distintas de una misma librer\u00eda.<\/p>\n<p>Esta entrada no se centrar\u00e1 en la instalaci\u00f3n de versiones de <strong><em>Python. <\/em><\/strong>Recomendamos utilizar la versi\u00f3n <strong><em>3<\/em><\/strong>, aunque servir\u00eda con la <strong><em>2.7<\/em><\/strong>, por lo que os dejo un enlace en donde se explica en detalle como hacerlo de forma muy sencilla <a href=\"https:\/\/linuxize.com\/post\/how-to-install-python-3-on-centos-7\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">https:\/\/linuxize.com\/post\/how-to-install-python-3-on-centos-7\/<\/a>. <span style=\"text-decoration: underline;\">Ignorad la parte en donde se explica la instalaci\u00f3n de los entornos virtuales, ya que no es compatible con la integraci\u00f3n del WSGI de Apache que vamos a utilizar en este tutorial<\/span>.<\/p>\n<p>Vamos al l\u00edo!!!!!<\/p>\n<hr \/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_76 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de contenidos<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a1ad512855b2\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a1ad512855b2\"  aria-label=\"Alternar\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Requisitos\"  rel=\"nofollow\" target=\"_blank\">Requisitos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Apache_WSGI\"  rel=\"nofollow\" target=\"_blank\">Apache WSGI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-3 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Pip_y_virtualenv\"  rel=\"nofollow\" target=\"_blank\">Pip y virtualenv<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-4 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Entorno_virtual\"  rel=\"nofollow\" target=\"_blank\">Entorno virtual<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-5 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Flask\"  rel=\"nofollow\" target=\"_blank\">Flask<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-6 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#WSGI_config\"  rel=\"nofollow\" target=\"_blank\">WSGI config<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-7 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Apache_y_VirtualHost\"  rel=\"nofollow\" target=\"_blank\">Apache y VirtualHost<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-8 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Acceso\"  rel=\"nofollow\" target=\"_blank\">Acceso<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-9 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\/#Enlaces_de_interes\"  rel=\"nofollow\" target=\"_blank\">Enlaces de inter\u00e9s<\/a><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"Requisitos\"><\/span>Requisitos<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<ul>\n<li>Centos 7<\/li>\n<li>Python 3.6<\/li>\n<li>Pip<\/li>\n<li>Librer\u00eda <strong><em>virtualenv<\/em> <\/strong>de Python<\/li>\n<li>Librer\u00eda <strong><em>Flask<\/em> <\/strong>de Python<\/li>\n<li>Apache<\/li>\n<li>Apache Web Server Gateway Interface &#8211; WSGI<\/li>\n<\/ul>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Apache_WSGI\"><\/span>Apache WSGI<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Instalamos el m\u00f3dulo <em><strong>WSGI<\/strong> <\/em>para <em><strong>Apache<\/strong><\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">sudo yum install mod_wsgi<\/pre>\n<p>Comprobamos que se ha instalado correctamente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">httpd -M | grep wsgi<\/pre>\n<p>De no estarlo tocar\u00e1 investigar un poco.<\/p>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Pip_y_virtualenv\"><\/span>Pip y virtualenv<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Ahora instalamos la versi\u00f3n de Pip compatible con nuestra versi\u00f3n de Python (2 o 3). No indico ninguna versi\u00f3n en el comando para que quede a elecci\u00f3n del usuario:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">sudo yum install python-pip<\/pre>\n<p>Ahora toca instalar los entornos virtuales de <strong><em>Python<\/em><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">sudo pip install virtualenv<\/pre>\n<p>Por ejemplo, en mi caso ser\u00eda <strong><em>pip3 install virtualenv<\/em><\/strong>.<\/p>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Entorno_virtual\"><\/span>Entorno virtual<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Para crear un entorno virtual primero creamos el directorio en el que vamos a trabajar y nos ubicamos en el:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">mkdir \/path\/to\/your\/app\r\ncd \/path\/to\/your\/app<\/pre>\n<p>Ahora ejecutamos el comando para crear el entorno virtual. Le tenemos que indicar un nombre al entorno virtual, lo que crear\u00e1 un nuevo directorio en donde se ubicar\u00e1n las librer\u00edas que utilizaremos \u00fanicamente en este entorno aislado y los comandos para activar\/desactivar el entorno virtual. Indicar la versi\u00f3n de <em><strong>Python<\/strong> <\/em>que se va a utilizar sustituy\u00e9ndolo en donde aparece <em><strong>pythonX<\/strong><\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">virtualenv env_name -p pythonX<\/pre>\n<p>Por ejemplo, en mi caso uso <strong><em>Python<\/em> <\/strong>en su versi\u00f3n 3, por lo que indico <strong><em>-p python3<\/em> <\/strong>en el comando.<\/p>\n<p>Activamos el entorno virtual:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">source env_name\/bin\/activate<\/pre>\n<p>Ahora en el promp aparece el nombre que le dimos al entorno virtual al comienzo de la l\u00ednea de comandos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">(env_name)user@host:~\/app$<\/pre>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Flask\"><\/span>Flask<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Instalamos la librer\u00eda <em><strong>Flask<\/strong><\/em> con el comando <em><strong>pip<\/strong><\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">pip install flask<\/pre>\n<p>Ahora tendremos una instalaci\u00f3n de <strong><em>Flask<\/em><\/strong> \u00fanicamente para el entorno virtual en el que nos encontramos.<\/p>\n<p>Creamos en el mismo directorio del entorno virtual una aplicaci\u00f3n sencilla de <strong><em>Flask<\/em><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nano \/path\/to\/your\/app\/my_app.py<\/pre>\n<p>Esta aplicaci\u00f3n devolver\u00e1 un sencillo \u00abHola mundo!\u00bb por pantalla. Recordar cambiar el host en donde escuchar\u00e1 la aplicaci\u00f3n, al final del documento (<em><strong>X.X.X.X<\/strong><\/em>). Se puede indicar una IP del servidor o un nombre de host que resuelva a dicha IP:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">#!\/usr\/bin\/python3\r\n\r\nfrom flask import Flask, request\r\n\r\napp = Flask(__name__)\r\n\r\n@app.route('\/')\r\ndef index():\r\n        return 'Hola mundo!'\r\n\r\n\r\nif __name__ == '__main__':\r\n       app.run(debug=True, host=X.X.X.X)<\/pre>\n<p>Con el flag <strong><em>debug=True<\/em> <\/strong>podemos hacer cambios en caliente sobre el documento sin tener que reiniciar el servidor web.<\/p>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"WSGI_config\"><\/span>WSGI config<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Creamos un archivo en donde indicamos al servidor <strong><em>WSGI<\/em> <\/strong>c\u00f3mo activar el entorno virtual y ejecutar la aplicaci\u00f3n de <strong><em>Flask<\/em> <\/strong>reci\u00e9n creada. Tendr\u00e1 una extensi\u00f3n <strong><em>.wsgi<\/em> <\/strong>y se encontrar\u00e1 en el mismo path que el entornor virtual y la aplicaci\u00f3n de <em><strong>Flask<\/strong> <\/em>creada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nano \/path\/to\/your\/app\/app.wsgi<\/pre>\n<p>En este archivo importaremos la aplicaci\u00f3n creada y la renombraremos, adem\u00e1s de indicar el comando para activar el entorno virtual del que har\u00e1 uso el servidor web, como veremos m\u00e1s adelante:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from my_app import app as application\r\n\r\nactivate_this = '\/path\/to\/my\/app\/nom_entorno_virt\/bin\/activate_this.py'\r\nexecfile(activate_this, dict(__file__=activate_this))<\/pre>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Apache_y_VirtualHost\"><\/span>Apache y VirtualHost<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Primero configuramos <strong><em>Apache<\/em> <\/strong>para habilitar el directorio en donde se ubicar\u00e1n los archivos de configuraci\u00f3n de los <strong><em>VirtualHost<\/em> <\/strong>que tendremos en el servidor web:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">nano \/etc\/httpd\/conf\/httpd.conf<\/pre>\n<p>Tendremos que asegurarnos de disponer de la siguiente l\u00ednea:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">IncludeOptional sites-enabled\/*.conf<\/pre>\n<p>Y si usamos el <strong><em>flag<\/em> <\/strong>de <strong><em>Flask<\/em> <em>debug=True <\/em><\/strong>debemos de agregar tambi\u00e9n esta:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">WSGIRestrictStdout Off<\/pre>\n<p>Ahora creamos el contenido del <strong><em>VirtualHost<\/em><\/strong> imaginando que nuestra aplicaci\u00f3n escuchar\u00e1 har\u00e1 uso del dominio<strong><em> example.com<\/em><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">sudo nano \/etc\/httpd\/sites-available\/example.conf<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">&lt;VirtualHost *:80&gt;\r\n\r\n        WSGIDaemonProcess my_app user=apache group=apache threads=5 python-path=\/path\/to\/my\/app:\/path\/to\/my\/app\/lib\/python3.6\/site-packages\r\n  WSGIScriptAlias \/ \/path\/to\/my\/app\/my_app.wsgi\r\n        # You have to add every Flask route as WSGI alias:\r\n        WSGIScriptAlias \/(.*) \/path\/to\/my\/app\/my_app.wsgi\/(.*)\r\n        &lt;Directory \/var\/www\/html\/flask&gt;\r\n                WSGIProcessGroup my_app\r\n                WSGIApplicationGroup %{GLOBAL}\r\n                Order deny,allow\r\n                Allow from all\r\n        &lt;\/Directory&gt;\r\n\r\n        ServerName example.com\r\n        ServerAdmin example@example.com\r\n        DocumentRoot \/path\/to\/your\/app\r\n        # DocumentRoot \/home\/ubuntu\/test\r\n        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,\r\n        # error, crit, alert, emerg.\r\n        # It is also possible to configure the loglevel for particular\r\n        # modules, e.g.\r\n        #LogLevel info ssl:warn\r\n        LogLevel warn\r\n        ErrorLog \/var\/log\/httpd\/my_app-error.log\r\n        CustomLog \/var\/log\/httpd\/my_app-access.log combined\r\n\r\n&lt;\/VirtualHost&gt;<\/pre>\n<p>Ahora creamos el enlace simb\u00f3lico desde el directorio <em><strong>sites-available<\/strong><\/em> al de <em><strong>sites-enabled<\/strong><\/em>, configurado previamente en el archivo de configuraci\u00f3n de <strong><em>Apache<\/em><\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">ln -s \/etc\/httpd\/sites-available\/example.conf \/etc\/httpd\/sites-enabled\/example.conf<\/pre>\n<p>Cambiamos los permisos del directorio en donde tenemos la aplicaci\u00f3n ubicada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">sudo chown -vR apache: \/path\/to\/your\/app\r\nsudo chmod -vR g+w \/path\/to\/your\/app<\/pre>\n<p>Y para finalizar reiniciamos el servidor web:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">sudo service httpd restart<\/pre>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Acceso\"><\/span>Acceso<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Ahora si accedemos a la URL que hemos configurado en el servidor web, en nuestro caso <em><strong>http:\/\/example.com<\/strong><\/em>, veremos la aplicaci\u00f3n creada en un entorno virutal de <em><strong>Python<\/strong><\/em> con <em><strong>Flask<\/strong> <\/em>y administrada por el servidor web <em><strong>Apache<\/strong><\/em>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-594\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2019\/08\/Captura.png\" alt=\"\" width=\"548\" height=\"221\" \/><\/p>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Enlaces_de_interes\"><\/span>Enlaces de inter\u00e9s<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Flask pincha <a href=\"https:\/\/es.wikipedia.org\/wiki\/Flask\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n<p>WSGI pincha <a href=\"https:\/\/en.wikipedia.org\/wiki\/Web_Server_Gateway_Interface\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n<p>Python 3 instalaci\u00f3n en Centos 7 &#8211;\u00a0<a href=\"https:\/\/linuxize.com\/post\/how-to-install-python-3-on-centos-7\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">https:\/\/linuxize.com\/post\/how-to-install-python-3-on-centos-7\/<\/a><\/p>\n<p>Apache wsgi pincha <a href=\"https:\/\/modwsgi.readthedocs.io\/en\/develop\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recientemente he estado trabajando en c\u00f3mo integrar el Framework de Python Flask con un servidor web corriendo bajo Centos7 y as\u00ed poder tenerlo siempre disponible<span class=\"read-more-link\"><a class=\"read-more\" href=\"https:\/\/blog.tiraquelibras.com\/?p=590\">Read More<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":589,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-590","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ciberseguridad"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=590"}],"version-history":[{"count":0,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/590\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/media\/589"}],"wp:attachment":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}