sql >> Database >  >> RDS >> Database

Rethink Flask - Een eenvoudige takenlijst mogelijk gemaakt door Flask en RethinkDB

Na een aantal verzoeken om een ​​standaard Flask- en RethinkDB-sjabloon, besloot ik om door te gaan en een blogpost te schrijven. Dit is dat bericht.

BTW:We zijn altijd blij met verzoeken. Als je iets hebt waarover je wilt dat we schrijven of bouwen, stuur ons dan een e-mail.

Vandaag maken we een eenvoudige takenlijst, die u kunt aanpassen aan uw eigen behoeften. Voordat u begint, raad ik u ten zeerste aan dit artikel te lezen, waarin wordt beschreven hoe RethinkDB verschilt van sommige van de andere NoSQL-databases.


RethinkDB instellen


Installeer RethinkDB

Navigeer hier en download het juiste pakket voor uw systeem. Ik gebruikte Homebrew - $ brew install rethinkdb - en het duurde bijna twintig minuten om de build te downloaden en te installeren:

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


Installeer de Python-stuurprogramma's wereldwijd

$ sudo pip install rethinkdb

Opmerking: Ik heb Rethink globaal geïnstalleerd (buiten een virtualenv) omdat ik waarschijnlijk dezelfde versie zal gebruiken met een aantal projecten, met een aantal verschillende talen. We zullen later in deze tutorial installeren in een virtualenv.



Test je instellingen

Laten we eerst de server starten met het volgende commando:

$ rethinkdb

Als alles correct is geïnstalleerd, zou u iets moeten zien dat lijkt op:

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 vervolgens de verbinding. Open een nieuw venster in uw terminal en voer de volgende opdrachten in:

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

Je zou moeten zien:

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

Verlaat de Python-shell maar laat de RethinkDB-server draaien in het andere terminalvenster.




Een Basic Flask-project opzetten


Maak een map om uw project op te slaan

$ mkdir flask-rethink
$ cd flask-rethink


Een virtualenv instellen en activeren

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


Installeer Flask en Flask-WTF

$ pip install flask
$ pip install flask-wtf


Maak een Pip-vereistenbestand

$ pip freeze > requirements.txt


Download de Flask boilerplate

Gevonden in de sjabloonmap van deze repo. Uw projectstructuur zou er nu als volgt uit moeten zien:

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


Voer de app uit

$ python run.py

Navigeer naar http://localhost:5000/, en je zou moeten zien:

Probeer nog niets in te dienen, want we moeten eerst een database-setup krijgen. Laten we RethinkDB aan de gang krijgen.




RethinkDB Config


Installeer RethinkDB

$ pip install rethinkdb


Voeg de volgende code toe aan "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

Bekijk de opmerkingen voor een korte uitleg van wat elk van de functies doet.



Start je server opnieuw

U zou de volgende waarschuwing in uw terminal moeten zien:

Database setup completed

Als je deze fout ziet rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015. uw RethinkDB-server is niet actief. Open een nieuw terminalvenster en voer $ rethinkdb uit .

Dus hebben we een nieuwe database gemaakt met de naam "todo", die een tabel heeft met de naam "todos".

U kunt dit verifiëren in de RethinkDB-beheerder. Navigeer naar http://localhost:8080/. De beheerder zou moeten laden. Als u op "Tabellen" klikt, ziet u de database en tabel die we hebben gemaakt:



Todos weergeven

Laten we met de database-instellingen code toevoegen om taken weer te geven. Update de index() functie in "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)

Hier selecteren we de "todos" -tabel, halen alle gegevens op, die zich in JSON bevinden, en geven de hele tabel door aan de sjabloon.



Gegevens handmatig toevoegen

Voordat we taken kunnen bekijken, moeten we er eerst een aantal toevoegen. Laten we de shell doornemen en ze handmatig toevoegen.

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

Dus we maakten verbinding met de database en voerden vervolgens drie nieuwe objecten in de tabel in de database in. Bekijk de API-documenten voor meer informatie.

Start de server op. Je zou nu de drie taken moeten zien:



Voltooi het formulier

Update de index() functie opnieuw om de gegevens uit het formulier te halen en aan de database toe te voegen:

@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 dit uit. Voeg wat taken toe. Doe eens gek.




Conclusie en uitdagingen

De huidige app is functioneel, maar er is nog veel meer dat we kunnen doen. Til deze app naar een hoger niveau.

Hier zijn een paar ideeën:

  1. Voeg een gebruikerslogin toe.
  2. Maak een robuuster formulier, waar je voor elke taak een vervaldatum kunt toevoegen, en sorteer de taken vervolgens op die datum voordat je ze naar de DOM stuurt.
  3. Functie- en eenheidstests toevoegen.
  4. Voeg de mogelijkheid toe om voor elke taak subtaken te maken.
  5. Lees de API-referentiedocumenten door. Speel met verschillende methoden.
  6. Modulair maken van de app.
  7. Refactor de code. Laat je nieuwe code zien aan RethinkDB.

Wat zou je nog meer willen zien? Benieuwd naar een deel 2? Wat vind je van RethinkDB in vergelijking met MongoDB? Deel uw mening hieronder.

Je kunt alle code uit de repo halen. Proost!



  1. verschil tussen localhost en postgres voor host in docker

  2. Hoe SQL-injectie-aanvallen te voorkomen door Secure

  3. 3 methoden om alle indexen voor alle tabellen opnieuw op te bouwen met T-SQL in SQL Server-database

  4. Genereer een integer-reeks in MySQL