Blog
Librerías a instalar en este capítulo:
- gunicorn
- psycopg2
Para poder desplegar nuestra app en un servidor de pruebas como Heroku necesitamos 2 herramienta, necesitamos de la herramienta git para crear el repositorio y de el propio cliente de Heroku, pero antes de proceder vamos a conocer bien sobre Heroku y Git.
¿Qué es Heroku?
Según wikipedia, Heroku es una web que brinda un servicio de computación en la nube, que soporta distintos lenguajes como Python, PHP, NodeJS, Ruby, Java, Go, Scala, Clojure. Heroku hoy en día es utilizado para desplegar las aplicaciones que necesiten ser testeadas desde un servidor, pero también es utilizado por escuelas e incluso universidades para proyectos de programación con sus estudiantes.
Instalando Heroku
El paso principal para poder interactuar con Heroku y podes desplegar nuestra aplicación en sus servidores es instalando su cliente, para ello hacemos click aquí. Este enlace nos llevará a la documentación de heroku y allí tendremos todos los sistemas operativos a los que Heroku presta soporte, en mi caso me encuentro en Windows 10 64 bits, entonces escogí dicho cliente y lo instale siguiendo los típicos paso de siguiente siguiente.
Ahora el siguiente paso es crearse una cuenta en Heroku, lo cual es sumamente fácil y lo pueden hacer desde aquí. Acá se encontraran con el formulario de registro el cual deben llenar con sus datos:
Luego hacemos click en “CREATE FREE ACCOUNT” y ya tendremos nuestra cuenta, hasta aquí son los pasos de instalación de Heroku pero para poder subir nuestra app a Heroku necesitamos hacer uso de la herramienta Git ya que heroku necesita de ella.
¿Qué es Git?
Citando nuevamente a wikipedia git es un software de control de versiones diseñado y su propósito es llevar registro de los cambios en archivos de un proyecto y coordinar el trabajo que varias personas realizan sobre el mismo. Ejemplos claro de esto se ven en los sitios de alojamiento de repositorios como github, gitlab, bitbucket y entre otros, donde se comparte un proyecto inicial y luego otras personas puedan participar en su desarrollo, pero claro; para esto se necesitan permisos especiales del propietario del repositorio en github se le conocen como “contribuidores” o “colaboradores”.
Instalando Git
Entramos a la web oficial de Git y ya esta reconocerá nuestro sistema operativo, simplemente debemos seguir las intrucciones para descargar, en mi caso la web me muestra ya un botón que me permitirá descargar Git, pero si estas en Linux, si mal no recuerdo se te mostrará el comando de instalación que debes escribir en la consola para descargarlo.
Una vez descargado, nuevamente hacemos la típica instalación de siguiente siguiente aunque a diferencia de Heroku git te preguntará si deseas activarlas y por lo general estas no las activamos a menos que queramos hacer un uso avanzado de git. De igual forma, estas opciones si no se activan puedes activarlas más tarde. Por ahora te recomendaría instalar git con las opciones que vienen marcadas por defecto.
Muy bien, tenemos instalado tanto Heroku como Git y ahora lo que voy a hacer es escribir el comando que me dirá las versiones, para git usamos:
λ git --version git version 2.24.0.windows.2
Para Heroku usamos:
λ heroku --version heroku/7.35.0 win32-x64 node-v12.13.0
Ahora lo que sigue es configurar git, para poder subir nuestros repositorios a servidores que soporten esta tecnología, git nos pide que le digamos como queremos ser identificados por los servicios a donde vayamos a subir nuestro repositorio entonces para esto debemos decirle el nombre de usuario y nuestro correo electrónico:
git --global user.name "Nombre de usuario" git --global user.email "TuEmail"
Es importante destacar que estas configuraciones son para simplemente decirle a los servicios que reciban nuestro repositorio, quien fue el que hizo dicha upload o como se le conoce en git “commit”. Un ejemplo de esto en Bitbucket:
Como pueden notar, la siguiente imagen muestra un primer commit sin estas configuraciones y la segunda con las configuraciones ya hechas. Entonces para esto es que se hace esta configuración, la cual obviamente recomiendo hacerla.
Desplegando nuestra app a Heroku
Llegados a este punto donde debemos tener instalado ya el cliente de Heroku y Git, lo que falta por hacer es ir a nuestro proyecto y en el python de nuestro entorno virtual instalar gunicorn que básicamente es el servidor HTTP donde funcionará nuestra app, para instalarlo simplemente vamos a la consola y estando ya dentro de nuestro entorno virtual lo instalamos con el siguiente comando:
(env) λ pip install gunicorn
Ahora vamos a crear una app dentro de heroku a través de la consola, las app en heroku es el espacio donde subiremos nuestra aplicación y para hacerlo debemos loguearnos desde consola heroku:
(env) λ heroku login heroku: Press any key to open up the browser to login or q to exit:
Acá Heroku nos pide que presionemos cualquier tecla, al hacerlo se nos abrirá una ventana en nuestro navegador, vamos a ella y hacemos click en login nos logueamos y luego ya podremos cerrar dicha ventana, al hacerlo por consola heroku nos debe decir que ya estamos logueados de la siguiente manera:
heroku login heroku: Press any key to open up the browser to login or q to exit: Opening browser to https://cli-auth.heroku.com/auth/cli/browser/d301506a-cf6b-4188-893e-e52873b0d9ba Logging in... done Logged in as CorreoDeTuCuentaHeroku@gmail.com
Una vez logueados, vamos a crear la app con el siguiente comando:
(env) λ heroku create web-uniblog Creating ⬢ web-uniblog... done https://web-uniblog.herokuapp.com/ | https://git.heroku.com/web-uniblog.git
El nombre de mi app es “web-uniblog” acá es importante que le den un nombre único a su app, ya que si el nombre esta registrado en heroku no los dejará crearla. Si usan el mismo nombre que yo, Heroku les dirá que usen otro.
Listo, ya hemos configurado nuestra app en Heroku. Ahora lo que vamos a hacer es ir a la web de Heroku y en el dashboard de nuestro usuario ya deberíamos ver la app que hemos creado:
Lo siguiente que debemos hacer es cambiar nuestra base de datos, ya que desde los inicios de nuestro proyecto usamos sqlite y heroku soporta sqlite pero esta debe emularse bajo postgreSQL entonces para hacer esto es preferible cambiar nuestra base de datos a postgreSQL, pero si deseas seguir usando sqlite aquí te dejo la documentación oficial de heroku para hacerlo.
No te preocupes por cambiar de base de datos, este no será un problema ya que estamos haciendo uso de SQLAlchemy y la finalidad principal de esta librería es usar la misma sintaxis para todas las bases de datos (Aunque no lo sea así, la sintaxis de postgreSQL es diferente a la de sqlite solo que la función de SQLAlchemy es permitirnos hacer uso de sus clases y el se encarga de elaborar las sintaxis de consulta para los diferentes tipos de bases de datos).
Seleccionamos dicha app y luego nos dirigimos a Resources y en Add-ons tipeamos “Heroku Postgres”:
Hacemos click en el Add-ons y luego seleccionamos el plan “Hobby Dev – Free” para hacer uso de la versión gratuita y luego click en “Provision” para crear la base de datos, una vez creada la veremos situada en la parte de abajo y basta con hacer click en ella para abrirla. Una vez dentro del panel de administración de la base de datos, debemos ver el URI de la base de datos para poder conectarnos a ella desde nuestra app, entonces vamos a “Settings” y hacemos click en “View Credentials”:
Luego de esto nos mostrará las credenciales de nuestra base de datos, la que nos interesa es el URI como te lo he comentado anteriormente y lo debemos copiar:
Copiamos la URI y nos dirigimos al archivo config.py, en la clase ajustes modificamos su atributo SQLALCHEMY_DATABASE_URI
y allí colocamos el URI de nuestra base de datos:
class Ajustes(object): SECRET_KEY = os.environ.get('SECRET_KEY') or 'flask-course' SQLALCHEMY_DATABASE_URI = 'postgres://qejzqjpgmauvxj:052b26bf64cb13fa0e2b1af40823d8e94f24d1df696f3cb6ef461bcd09f9c527@ec2-18-213-176-229.compute-1.amazonaws.com:5432/dd679vcg6hrutv' SQLALCHEMY_TRACK_MODIFICATIONS = False POSTS_PER_PAGE = 3
Con esta configuración ahora nuesta app esta conectada a la base de datos de heroku, pero falta ahora crear las tablas. Teniendo en cuenta que ya nuestra app esta conectada a dicha base de datos, vamos a usar la consola de python para crear las tablas, pero primero debemos instalar el modulo de postgreSQL para python llamado psycopg2
ya que SQLAlchemy hace uso de este, entonces en nuestro entorno virtual:
(env) λ pip install psycopg2
Una vez instalado vamos a la consola y con flask shell le indicamos el comando para crear las tablas:
(env) λ flask shell Python 3.7.5 (tags/v3.7.5:5c02a39a0b, 15 , 00:11:34) [MSC v.1916 64 bit (AMD64)] on win32 App: app [development] Instance: # >>> from app import bdd >>> bdd.create_all()
Hacemos uso de bdd.create_all() esto le dice a SQLAlchemy que cree todos los modelos que tengamos definidos y creará las tablas en la base de datos de heroku y ahora ya tenemos nuestra base de datos lista para que pueda funcionar con nuestra app. Como último paso solo nos falta subir nuestra app online.
Vamos a configurar ahora nuestra aplicación, para decirle a git que es lo que no debe subir a heroku, esto lo haremos con un archivo llamado .gitignore
que crearemos en la raíz de la carpeta de nuestro proyecto, dentro de este archivo voy a agregar la carpeta del entorno virtual, la carpeta de migraciones que creo la librería de flask-migrate y la base de datos sqlite, entonces el archivo quedaría así:
env migrations app.db
Una vez hecho esto, debemos crear un archivo de texto en la raíz de nuestro proyecto llamado runtime.txt y debe contener la versión de python que estamos utilizando y para saber que versión tenemos usamos el siguiente comando:
(env) λ python --version Python 3.7.5
En mi caso tengo la versión de python 3.7.5, entonces en el archivo runtime.txt lo colocamos de la siguiente manera:
python-3.7.5
Paso siguiente es crear un archivo llamando Procfile el cual también debe crearse en la raíz de nuestro proyecto y debe contener lo siguiente:
web: gunicorn app:app
Acá en este archivo le decimos a heroku que usaremos a gunicorn como servidor HTTP y que nuestra app se encuentra en una variable a la que también llamamos app (app = Flask(__name__)).
Ahora solo resta crear el archivo llamado requirements.txt, el cual le dirá a heroku cuales son las dependencias de nuestra app para que pueda ejecutarse correctamente, este archivo lo generamos con un comando pero es importante estar situado como los pasos anteriores en nuestro entorno virtual y tipeamos el siguiente comando:
pip freeze --local > requirements.txt
Es super importante que este archivo lleve el nombre requirements.txt, porque así es como lo reconocerá Heroku, por otro lado debemos cambiar nuestras variables de entorno globales de el archivo .flaskenv ya que pasaremos del modo desarrollo al modo producción y el archivo lo cambiamos para que luzca así:
FLASK_ENV=production FLASK_DEBUG=0 FLASK_APP=blog.py
Una vez hecho todo esto ya tenemos nuestro proyecto totalmente configurado y solo resta subirlo con git. El proyecto actualmente se ve de la siguiente manera:
Ahora por consola creamos el repositorio con el comando git init
este comando creará el repositorio de nuestro proyecto y acá cargaremos todo el contenido de nuestra app, para cargar todo el contenido usamos el comando git add .
y luego con git status
podemos ver los archivos que se van a agregar a nuestro repositorio, por último para finalmente cargar esos archivos al repositorio usamos git commit -m "nombre del commit"
el argumento nombre del commit lo que hace es identificar los cambios que se hicieron en dicho commit, es igual a como identificabamos los cambios con flask db migrate -m
, por consola lo haríamos así:
(env) λ git init Initialized empty Git repository in C:/Users/MyUsuario/Desktop/miBlog/.git/ (env) λ git add . (env) λ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: .flaskenv new file: .gitignore new file: Procfile new file: __pycache__/blog.cpython-37.pyc new file: app/__init__.py new file: app/__pycache__/__init__.cpython-37.pyc new file: app/__pycache__/enviar_email.cpython-37.pyc new file: app/__pycache__/errores.cpython-37.pyc new file: app/__pycache__/formularios.cpython-37.pyc new file: app/__pycache__/modelos.cpython-37.pyc new file: app/__pycache__/rutas.cpython-37.pyc new file: app/enviar_email.py new file: app/errores.py new file: app/formularios.py new file: app/modelos.py new file: app/rutas.py new file: app/settings/__init__.py new file: app/settings/__pycache__/__init__.cpython-37.pyc new file: app/settings/__pycache__/config.cpython-37.pyc new file: app/settings/config.py new file: app/static/css/main.css new file: app/static/icons/picture.png new file: app/static/js/Moment.js new file: app/static/js/jquery-form.js new file: app/static/js/main.js new file: app/static/uploads/gamersnautas new file: app/static/uploads/jose19 new file: app/static/uploads/jose19_atardecer.jpg new file: app/static/uploads/jose19_background-desktop.jpg new file: app/static/uploads/jose19_desktop.jpg new file: app/static/uploads/jose19_james.jpg new file: app/templates/$ajax_posts.html new file: app/templates/$post.html new file: app/templates/404.html new file: app/templates/500.html new file: app/templates/base.html new file: app/templates/editar_perfil.html new file: app/templates/index.html new file: app/templates/iniciar_sesion.html new file: app/templates/qwdqw.html new file: "app/templates/recuperar_contrase\303\261a.html" new file: "app/templates/recuperar_contrase\303\261a.txt" new file: app/templates/registro.html new file: "app/templates/resetear_contrase\303\261a.html" new file: app/templates/usuarios.html new file: blog.py new file: requirements.txt new file: runtime.txt (env) λ git commit -m "primer commit" [master (root-commit) 23b5eed] primer commit 48 files changed, 7040 insertions(+) create mode 100644 .flaskenv create mode 100644 .gitignore create mode 100644 Procfile create mode 100644 __pycache__/blog.cpython-37.pyc create mode 100644 app/__init__.py create mode 100644 app/__pycache__/__init__.cpython-37.pyc create mode 100644 app/__pycache__/enviar_email.cpython-37.pyc create mode 100644 app/__pycache__/errores.cpython-37.pyc create mode 100644 app/__pycache__/formularios.cpython-37.pyc create mode 100644 app/__pycache__/modelos.cpython-37.pyc create mode 100644 app/__pycache__/rutas.cpython-37.pyc create mode 100644 app/enviar_email.py create mode 100644 app/errores.py create mode 100644 app/formularios.py create mode 100644 app/modelos.py create mode 100644 app/rutas.py create mode 100644 app/settings/__init__.py create mode 100644 app/settings/__pycache__/__init__.cpython-37.pyc create mode 100644 app/settings/__pycache__/config.cpython-37.pyc create mode 100644 app/settings/config.py create mode 100644 app/static/css/main.css create mode 100644 app/static/icons/picture.png create mode 100644 app/static/js/Moment.js create mode 100644 app/static/js/jquery-form.js create mode 100644 app/static/js/main.js create mode 100644 app/static/uploads/gamersnautas create mode 100644 app/static/uploads/jose19 create mode 100644 app/static/uploads/jose19_atardecer.jpg create mode 100644 app/static/uploads/jose19_background-desktop.jpg create mode 100644 app/static/uploads/jose19_desktop.jpg create mode 100644 app/static/uploads/jose19_james.jpg create mode 100644 app/templates/$ajax_posts.html create mode 100644 app/templates/$post.html create mode 100644 app/templates/404.html create mode 100644 app/templates/500.html create mode 100644 app/templates/base.html create mode 100644 app/templates/editar_perfil.html create mode 100644 app/templates/index.html create mode 100644 app/templates/iniciar_sesion.html create mode 100644 app/templates/qwdqw.html create mode 100644 "app/templates/recuperar_contrase\303\261a.html" create mode 100644 "app/templates/recuperar_contrase\303\261a.txt" create mode 100644 app/templates/registro.html create mode 100644 "app/templates/resetear_contrase\303\261a.html" create mode 100644 app/templates/usuarios.html create mode 100644 blog.py create mode 100644 requirements.txt create mode 100644 runtime.txt
Solo falta subir nuestra app a heroku, para ello ejecutamos el comando:
(env) λ heroku git:remote web-uniblog set git remote heroku to https://git.heroku.com/web-uniblog.git
Este comando le dice a heroku que subiremos nuestra aplicación en la app web-uniblog que fue el nombre que yo le di dentro de heroku, por último ejecutamos el siguiente comando para que nuestra aplicación se suba a heroku:
(env) λ git push heroku master Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 2 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done. Total 3 (delta 2), reused 0 (delta 0) remote: Compressing source files... done. remote: Building source: remote: remote: -----> Python app detected remote: ! Python has released a security update! Please consider upgrading to python-3.7.6 remote: Learn More: https://devcenter.heroku.com/articles/python-runtimes remote: -----> Need to update SQLite3, clearing cache remote: -----> Installing python-3.7.5 remote: -----> Installing pip remote: -----> Installing SQLite3 remote: Sqlite3 successfully installed. remote: -----> Installing requirements with pip remote: Collecting alembic==1.4.1 remote: Downloading alembic-1.4.1.tar.gz (1.1 MB) remote: Collecting blinker==1.4 remote: Downloading blinker-1.4.tar.gz (111 kB) remote: Collecting Click==7.0 remote: Downloading Click-7.0-py2.py3-none-any.whl (81 kB) remote: Collecting dominate==2.5.1 remote: Downloading dominate-2.5.1-py2.py3-none-any.whl (29 kB) remote: Collecting Flask==1.1.1 remote: Downloading Flask-1.1.1-py2.py3-none-any.whl (94 kB) remote: Collecting Flask-Bootstrap==3.3.7.1 remote: Downloading Flask-Bootstrap-3.3.7.1.tar.gz (456 kB) remote: Collecting Flask-Login==0.5.0 remote: Downloading Flask_Login-0.5.0-py2.py3-none-any.whl (16 kB) remote: Collecting Flask-Mail==0.9.0 remote: Downloading Flask-Mail-0.9.0.tar.gz (43 kB) remote: Collecting Flask-Migrate==2.5.2 remote: Downloading Flask_Migrate-2.5.2-py2.py3-none-any.whl (13 kB) remote: Collecting Flask-Moment==0.9.0 remote: Downloading Flask_Moment-0.9.0-py2.py3-none-any.whl (4.0 kB) remote: Collecting Flask-SQLAlchemy==2.4.1 remote: Downloading Flask_SQLAlchemy-2.4.1-py2.py3-none-any.whl (17 kB) remote: Collecting Flask-WTF==0.14.3 remote: Downloading Flask_WTF-0.14.3-py2.py3-none-any.whl (13 kB) remote: Collecting gunicorn==20.0.4 remote: Downloading gunicorn-20.0.4-py2.py3-none-any.whl (77 kB) remote: Collecting itsdangerous==1.1.0 remote: Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB) remote: Collecting Jinja2==2.11.1 remote: Downloading Jinja2-2.11.1-py2.py3-none-any.whl (126 kB) remote: Collecting Mako==1.1.2 remote: Downloading Mako-1.1.2-py2.py3-none-any.whl (75 kB) remote: Collecting MarkupSafe==1.1.1 remote: Downloading MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl (27 kB) remote: Collecting Pillow==7.0.0 remote: Downloading Pillow-7.0.0-cp37-cp37m-manylinux1_x86_64.whl (2.1 MB) remote: Collecting psycopg2==2.8.4 remote: Downloading psycopg2-2.8.4.tar.gz (377 kB) remote: Collecting PyJWT==1.7.1 remote: Downloading PyJWT-1.7.1-py2.py3-none-any.whl (18 kB) remote: Collecting python-dateutil==2.8.1 remote: Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB) remote: Collecting python-dotenv==0.12.0 remote: Downloading python_dotenv-0.12.0-py2.py3-none-any.whl (17 kB) remote: Collecting python-editor==1.0.4 remote: Downloading python_editor-1.0.4-py3-none-any.whl (4.9 kB) remote: Collecting six==1.14.0 remote: Downloading six-1.14.0-py2.py3-none-any.whl (10 kB) remote: Collecting SQLAlchemy==1.3.13 remote: Downloading SQLAlchemy-1.3.13.tar.gz (6.0 MB) remote: Collecting thread6==0.2.0 remote: Downloading thread6-0.2.0-py3-none-any.whl (4.2 kB) remote: Collecting visitor==0.1.3 remote: Downloading visitor-0.1.3.tar.gz (3.3 kB) remote: Collecting Werkzeug==1.0.0 remote: Downloading Werkzeug-1.0.0-py2.py3-none-any.whl (298 kB) remote: Collecting WTForms==2.2.1 remote: Downloading WTForms-2.2.1-py2.py3-none-any.whl (166 kB) remote: Building wheels for collected packages: alembic, blinker, Flask-Bootstrap, Flask-Mail, psycopg2, SQLAlchemy, visitor remote: Building wheel for alembic (setup.py): started remote: Building wheel for alembic (setup.py): finished with status 'done' remote: Created wheel for alembic: filename=alembic-1.4.1-py2.py3-none-any.whl size=158154 sha256=114f9ab945e17854b0d59ac1a7d5829cee2f072ef7d7aab77748b5fca1ec865e remote: Stored in directory: /tmp/pip-ephem-wheel-cache-ne5uv28e/wheels/be/5d/0a/9e13f53f4f5dfb67cd8d245bb7cdffe12f135846f491a283e3 remote: Building wheel for blinker (setup.py): started remote: Building wheel for blinker (setup.py): finished with status 'done' remote: Created wheel for blinker: filename=blinker-1.4-py3-none-any.whl size=13452 sha256=8cad5755dfddde287a0e2a608d027242809d611bf3e5c4687d8e8787a7fcdcb5 remote: Stored in directory: /tmp/pip-ephem-wheel-cache-ne5uv28e/wheels/22/f5/18/df711b66eb25b21325c132757d4314db9ac5e8dabeaf196eab remote: Building wheel for Flask-Bootstrap (setup.py): started remote: Building wheel for Flask-Bootstrap (setup.py): finished with status 'done' remote: Created wheel for Flask-Bootstrap: filename=Flask_Bootstrap-3.3.7.1-py3-none-any.whl size=460123 sha256=6476824aa4c8286a6aefaa879e46e1c1aa9a6bc893e523d6c8106120bd5039e3 remote: Stored in directory: /tmp/pip-ephem-wheel-cache-ne5uv28e/wheels/67/a2/d6/50d039c9b59b4caca6d7b53839c8100354a52ab7553d2456eb remote: Building wheel for Flask-Mail (setup.py): started remote: Building wheel for Flask-Mail (setup.py): finished with status 'done' remote: Created wheel for Flask-Mail: filename=Flask_Mail-0.9.0-py3-none-any.whl size=6797 sha256=08adfb086ff9edf55e97269aae9adb05f36d32682ec96f8a49d26d8d05003cad remote: Stored in directory: /tmp/pip-ephem-wheel-cache-ne5uv28e/wheels/78/c2/8d/9b7daf1733962aa32185a2769904c05260d61bf83a6ee608e6 remote: Building wheel for psycopg2 (setup.py): started remote: Building wheel for psycopg2 (setup.py): finished with status 'done' remote: Created wheel for psycopg2: filename=psycopg2-2.8.4-cp37-cp37m-linux_x86_64.whl size=453637 sha256=980ca234b4c9fee00e560f925da569965b37c7837f4f4cc8167edfbb9638a69d remote: Stored in directory: /tmp/pip-ephem-wheel-cache-ne5uv28e/wheels/e5/95/7b/9065a4dfe97a9b0e458215ea04fa87c169e20c9bddf49f766a remote: Building wheel for SQLAlchemy (setup.py): started remote: Building wheel for SQLAlchemy (setup.py): finished with status 'done' remote: Created wheel for SQLAlchemy: filename=SQLAlchemy-1.3.13-cp37-cp37m-linux_x86_64.whl size=1221912 sha256=c32f4c6f63cc99874d460ed83c1e6f68253c1cb98550c374ffe307cc950a2658 remote: Stored in directory: /tmp/pip-ephem-wheel-cache-ne5uv28e/wheels/b9/ba/77/163f10f14bd489351530603e750c195b0ceceed2f3be2b32f1 remote: Building wheel for visitor (setup.py): started remote: Building wheel for visitor (setup.py): finished with status 'done' remote: Created wheel for visitor: filename=visitor-0.1.3-py3-none-any.whl size=3931 sha256=3318a5391eb0d5fd852499c1c483a8ffec5e9105374b8eae110444450f1fc18c remote: Stored in directory: /tmp/pip-ephem-wheel-cache-ne5uv28e/wheels/64/34/11/053f47218984c9a31a00f911ed98dda036b867481dcc527a12 remote: Successfully built alembic blinker Flask-Bootstrap Flask-Mail psycopg2 SQLAlchemy visitor remote: Installing collected packages: SQLAlchemy, MarkupSafe, Mako, python-editor, six, python-dateutil, alembic, blinker, Click, dominate, itsdangerous, Werkzeug, Jinja2, Flask, visitor, Flask-Bootstrap, Flask-Login, Flask-Mail, Flask-SQLAlchemy, Flask-Migrate, Flask-Moment, WTForms, Flask-WTF, gunicorn, Pillow, psycopg2, PyJWT, python-dotenv, thread6 remote: Successfully installed Click-7.0 Flask-1.1.1 Flask-Bootstrap-3.3.7.1 Flask-Login-0.5.0 Flask-Mail-0.9.0 Flask-Migrate-2.5.2 Flask-Moment-0.9.0 Flask-SQLAlchemy-2.4.1 Flask-WTF-0.14.3 Jinja2-2.11.1 Mako-1.1.2 MarkupSafe-1.1.1 Pillow-7.0.0 PyJWT-1.7.1 SQLAlchemy-1.3.13 WTForms-2.2.1 Werkzeug-1.0.0 alembic-1.4.1 blinker-1.4 dominate-2.5.1 gunicorn-20.0.4 itsdangerous-1.1.0 psycopg2-2.8.4 python-dateutil-2.8.1 python-dotenv-0.12.0 python-editor-1.0.4 six-1.14.0 thread6-0.2.0 visitor-0.1.3 remote: remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 55.6M remote: -----> Launching... remote: Released v6 remote: https://web-uniblog.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. To https://git.heroku.com/web-uniblog.git 23b5eed..7a33c0d master -> master
Como vez, se comienza a subir nuestra app y luego de realizar todo el proceso al final nos muestra "done."
lo cual significa que todo ha salido bien, y bueno; así que esto es todo, si seguiste los pasos al pie de la letra no debería de haber problema alguno con la aplicación, ya podremos crear un usuario e iniciar sesión y contar con todas las características de nuestra app.
➡ Continúa aprendiendo con nuestro Curso de Flask – Python: