sql >> Base de Datos >  >> RDS >> Database

Rethink Flask:una simple lista de cosas por hacer impulsada por Flask y RethinkDB

Después de una serie de solicitudes de una plantilla básica de Flask y RethinkDB, decidí seguir adelante y escribir una publicación de blog. Esta es esa publicación.

Por cierto:siempre damos la bienvenida a las solicitudes. Si tiene algo sobre lo que le gustaría que escribamos o construyamos, envíenos un correo electrónico.

Hoy crearemos un simple Lista de tareas pendientes, que podrá modificar para satisfacer sus propias necesidades. Antes de comenzar, sugiero leer este artículo, que detalla cómo RethinkDB difiere de algunas de las otras bases de datos NoSQL.


Configurar RethinkDB


Instalar RethinkDB

Navegue aquí y descargue el paquete apropiado para su sistema. Usé Homebrew - $ brew install rethinkdb - y tardó casi veinte minutos en descargar e instalar la compilación:

==> Installing rethinkdb
==> Downloading http://download.rethinkdb.com/dist/rethinkdb-     1.11.2.tgz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/rethinkdb/1.11.2 --  fetch v8 --fetch protobuf
==> make
==> make install-osx
==> Caveats
To have launchd start rethinkdb at login:
  ln -sfv /usr/local/opt/rethinkdb/*.plist   ~/Library/LaunchAgents
Then to load rethinkdb now:
  launchctl load   ~/Library/LaunchAgents/homebrew.mxcl.rethinkdb.plist
==> Summary
🍺  /usr/local/Cellar/rethinkdb/1.11.2: 174 files, 29M, built in   19.7 minutes


Instalar los controladores Python globalmente

$ sudo pip install rethinkdb

Nota: Instalé Rethink globalmente (fuera de un virtualenv) ya que probablemente usaré la misma versión con varios proyectos, con varios idiomas diferentes. Instalaremos dentro de un virtualenv más adelante en este tutorial.



Prueba tu configuración

Primero, iniciemos el servidor con el siguiente comando:

$ rethinkdb

Si todo está instalado correctamente, debería ver algo similar a:

info: Creating directory /Users/michaelherman/rethinkdb_data
info: Creating a default database for your convenience. (This is because you ran 'rethinkdb' without 'create', 'serve', or '--join', and the directory '/Users/michaelherman/rethinkdb_data' did not already exist.)
info: Running rethinkdb 1.11.2 (CLANG 4.2 (clang-425.0.28))...
info: Running on Darwin 12.4.0 x86_64
info: Loading data from directory    /Users/michaelherman/rethinkdb_data
info: Listening for intracluster connections on port 29015
info: Listening for client driver connections on port 28015
info: Listening for administrative HTTP connections on port 8080
info: Listening on addresses: 127.0.0.1, ::1
info: To fully expose RethinkDB on the network, bind to all addresses
info: by running rethinkdb with the `--bind all` command line option.
info: Server ready

Luego prueba la conexión. Abra una nueva ventana en su terminal e ingrese los siguientes comandos:

>>>
$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()

Deberías ver:

>>>
<rethinkdb.net.Connection object at 0x101122410>

Salga del shell de Python pero deje el servidor RethinkDB ejecutándose en la otra ventana de terminal.




Configurar un proyecto Flask básico


Cree un directorio para almacenar su proyecto

$ mkdir flask-rethink
$ cd flask-rethink


Configurar y activar un virtualenv

$ virtualenv --no-site-packages env
$ source env/bin/activate


Instalar Flask y Flask-WTF

$ pip install flask
$ pip install flask-wtf


Cree un archivo de requisitos de Pip

$ pip freeze > requirements.txt


Descargar el modelo de Flask

Se encuentra en el directorio de plantillas de este repositorio. La estructura de su proyecto ahora debería verse así:

├── app
│   ├── __init__.py
│   ├── forms.py
│   ├── models.py
│   ├── templates
│   │   ├── base.html
│   │   └── index.html
│   └── views.py
├── readme.md
├── requirements.txt
└── run.py


Ejecutar la aplicación

$ python run.py

Vaya a http://localhost:5000/ y debería ver:

No intente enviar nada todavía, porque primero debemos configurar la base de datos. Pongamos en marcha RethinkDB.




Configuración de RethinkDB


Instalar RethinkDB

$ pip install rethinkdb


Agregue el siguiente código a "views.py"

# rethink imports
import rethinkdb as r
from rethinkdb.errors import RqlRuntimeError

# rethink config
RDB_HOST =  'localhost'
RDB_PORT = 28015
TODO_DB = 'todo'

# db setup; only run once
def dbSetup():
    connection = r.connect(host=RDB_HOST, port=RDB_PORT)
    try:
        r.db_create(TODO_DB).run(connection)
        r.db(TODO_DB).table_create('todos').run(connection)
        print 'Database setup completed'
    except RqlRuntimeError:
        print 'Database already exists.'
    finally:
        connection.close()
dbSetup()

# open connection before each request
@app.before_request
def before_request():
    try:
        g.rdb_conn = r.connect(host=RDB_HOST, port=RDB_PORT, db=TODO_DB)
    except RqlDriverError:
        abort(503, "Database connection could be established.")

# close the connection after each request
@app.teardown_request
def teardown_request(exception):
    try:
        g.rdb_conn.close()
    except AttributeError:
        pass

Consulte los comentarios para obtener una breve explicación de lo que hace cada una de las funciones.



Inicie su servidor de nuevo

Debería ver la siguiente alerta en su terminal:

Database setup completed

Si ve este error rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015. su servidor RethinkDB no se está ejecutando. Abre una nueva ventana de terminal y ejecuta $ rethinkdb .

Entonces, creamos una nueva base de datos llamada "todo", que tiene una tabla llamada "todos".

Puede verificar esto en RethinkDB Admin. Navegue a http://localhost:8080/. El administrador debería cargar. Si hace clic en "Tablas", debería ver la base de datos y la tabla que creamos:



Mostrar Todos

Con la configuración de la base de datos, agreguemos código para mostrar todos. Actualice el index() función en “views.py”:

@app.route("/")
def index():
    form = TaskForm()
    selection = list(r.table('todos').run(g.rdb_conn))
    return render_template('index.html', form=form, tasks=selection)

Aquí estamos seleccionando la tabla "todos", extrayendo todos los datos, que están en JSON, y pasando la tabla completa a la plantilla.



Añadir datos manualmente

Antes de que podamos ver todos, primero debemos agregar algunos. Repasemos el caparazón y agréguelos manualmente.

>>>
$ python
>>> import rethinkdb
>>> conn = rethinkdb.connect(db='todo')
>>> rethinkdb.table('todos').insert({'name':'sail to the moon'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'c5562325-c5a1-4a78-8232-c0de4f500aff'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>> rethinkdb.table('todos').insert({'name':'jump in the ocean'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'0a3e3658-4513-48cb-bc68-5af247269ee4'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>> rethinkdb.table('todos').insert({'name':'think of another todo'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'b154a036-3c3b-47f4-89ec-cb9f4eff5f5a'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>>

Entonces, nos conectamos a la base de datos, luego ingresamos tres nuevos objetos en la tabla dentro de la base de datos. Consulte los documentos de la API para obtener más información.

Enciende el servidor. Ahora debería ver las tres tareas:



Finalizar el formulario

Actualice el index() vuelva a funcionar para extraer los datos del formulario y agregarlos a la base de datos:

@app.route('/', methods = ['GET', 'POST'])
def index():
    form = TaskForm()
      if form.validate_on_submit():
          r.table('todos').insert({"name":form.label.data}).run(g.rdb_conn)
          return redirect(url_for('index'))
      selection = list(r.table('todos').run(g.rdb_conn))
      return render_template('index.html', form = form, tasks = selection)

Prueba esto. Agregue algunos todos. Vuélvete loco.




Conclusión y desafíos

La aplicación actual es funcional, pero hay mucho más que podemos hacer. Lleva esta aplicación al siguiente nivel.

Aquí hay algunas ideas:

  1. Agregue un inicio de sesión de usuario.
  2. Cree un formulario más sólido, en el que pueda agregar una fecha de vencimiento para cada tarea pendiente y luego ordenar las tareas pendientes por esa fecha antes de enviarlas al DOM.
  3. Agregue pruebas funcionales y unitarias.
  4. Agregue la capacidad de crear subtareas para cada tarea.
  5. Lea los documentos de referencia de la API. Juega con varios métodos.
  6. Modulalizar la aplicación.
  7. Refactorice el código. Muestra tu nuevo código a RethinkDB.

¿Qué más te gustaría ver? ¿Interesado en ver una parte 2? ¿Cómo te gusta RethinkDB en comparación con MongoDB? Comparte tus pensamientos a continuación.

Puede obtener todo el código del repositorio. ¡Salud!