sql >> Database teknologi >  >> RDS >> Database

Rethink Flask – En simpel opgaveliste drevet af Flask og RethinkDB

Efter en række anmodninger om en grundlæggende Flask and RethinkDB skabelon, besluttede jeg at gå videre og skrive et blogindlæg. Dette er det indlæg.

BTW:Vi hilser altid anmodninger velkommen. Hvis du har noget, du gerne vil have os til at skrive om eller bygge, så send os en e-mail.

I dag laver vi en simpel todo-liste, som du vil være i stand til at ændre for at opfylde dine egne behov. Før jeg begynder, anbefaler jeg stærkt at læse denne artikel, som beskriver, hvordan RethinkDB adskiller sig fra nogle af de andre NoSQL-databaser.


Konfigurer RethinkDB


Installer RethinkDB

Naviger her og download den passende pakke til dit system. Jeg brugte Homebrew - $ brew install rethinkdb - og det tog næsten tyve minutter at downloade og installere build:

==> 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
 


Installer Python-driverne globalt

$ sudo pip install rethinkdb
 

Bemærk: Jeg installerede Rethink globalt (uden for en virtualenv), da jeg sandsynligvis vil bruge den samme version med en række projekter, med en række forskellige sprog. Vi installerer i en virtualenv senere i denne tutorial.



Test din opsætning

Lad os først starte serveren med følgende kommando:

$ rethinkdb
 

Hvis alt er installeret korrekt, bør du se noget, der ligner:

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
 

Test derefter forbindelsen. Åbn et nyt vindue i din terminal, og indtast følgende kommandoer:

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

Du skal se:

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

Afslut Python-skallen, men lad RethinkDB-serveren køre i det andet terminalvindue.




Opsæt et Basic Flask-projekt


Opret en mappe til at gemme dit projekt

$ mkdir flask-rethink
$ cd flask-rethink
 


Konfigurer og aktiver en virtualenv

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


Installer Flask og Flask-WTF

$ pip install flask
$ pip install flask-wtf
 


Opret en Pip-kravfil

$ pip freeze > requirements.txt
 


Download Flask-kedelpladen

Findes i skabelonbiblioteket i denne repo. Din projektstruktur skulle nu se sådan ud:

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

Kør appen

$ python run.py
 

Naviger til http://localhost:5000/, og du bør se:

Forsøg ikke at indsende noget endnu, for vi skal først have en databaseopsætning. Lad os sætte gang i RethinkDB.




RethinkDB Config


Installer RethinkDB

$ pip install rethinkdb
 


Tilføj følgende kode til "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
 

Se kommentarerne for en kort forklaring af, hvad hver af funktionerne gør.



Start din server igen

Du bør se følgende advarsel i din terminal:

Database setup completed
 

Hvis du ser denne fejl rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015. din RethinkDB-server kører ikke. Åbn et nyt terminalvindue og kør $ rethinkdb .

Så vi oprettede en ny database kaldet "todo", som har en tabel kaldet "todos".

Du kan bekræfte dette i RethinkDB Admin. Naviger til http://localhost:8080/. Administratoren skal indlæse. Hvis du klikker på "Tabeller", skal du se den database og tabel, vi har oprettet:



Vis Todos

Med databaseopsætningen, lad os tilføje kode for at vise todos. Opdater index() funktion i "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)
 

Her vælger vi "todos"-tabellen, trækker alle data, som er i JSON, og sender hele tabellen til skabelonen.



Tilføj data manuelt

Før vi kan se nogle gøremål, skal vi først tilføje nogle. Lad os gå gennem skallen og tilføje dem manuelt.

>>>
$ 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}
>>>
 

Så vi oprettede forbindelse til databasen og indtastede derefter tre nye objekter i tabellen i databasen. Tjek API-dokumenterne for at få flere oplysninger.

Tænd serveren. Du skulle nu se de tre opgaver:



Fuldfør formularen

Opdater index() funktion igen for at trække dataene fra formularen og tilføje dem til databasen:

@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)
 

Test dette af. Tilføj nogle gøremål. Gå amok.




Konklusion og udfordringer

Den nuværende app er funktionel, men der er meget mere, vi kan gøre. Tag denne app til det næste niveau.

Her er et par ideer:

  1. Tilføj et brugerlogin.
  2. Opret en mere robust formular, hvor du kan tilføje en forfaldsdato for hver opgave, og derefter sortere opgaverne efter den dato, før du gengiver dem til DOM.
  3. Tilføj funktions- og enhedstests.
  4. Tilføj muligheden for at oprette underopgaver for hver opgave.
  5. Læs API-referencedokumenterne. Leg med forskellige metoder.
  6. Modulariser appen.
  7. Omfaktorer koden. Vis din nye kode frem til RethinkDB.

Hvad vil du ellers gerne se? Interesseret i at se en del 2? Hvordan kan du lide RethinkDB i forhold til MongoDB? Del dine tanker nedenfor.

Du kan hente al koden fra repoen. Skål!



  1. Hvad er forskellen mellem at bruge INDEX vs KEY i MySQL?

  2. Sådan beskytter du en database med adgangskode i Access 2016

  3. WEEKDAY() vs DAYOFWEEK() i MariaDB:Hvad er forskellen?

  4. SQL Server TempDB-overvågning ved hjælp af Dynamic Management Views (DMV)