Skip to content

Instantly share code, notes, and snippets.

@webwurst
Created March 6, 2012 11:09
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save webwurst/1985703 to your computer and use it in GitHub Desktop.
Save webwurst/1985703 to your computer and use it in GitHub Desktop.
This is the Flaskr-Tutorial using CouchDB instead of sqlite. For the original Tutorial see http://flask.pocoo.org/docs/tutorial/.
# -*- coding: utf-8 -*-
"""
Flaskr
~~~~~~
A microblog example application written as Flask tutorial with
Flask and couchdbkit.
:copyright: (c) 2010 by Armin Ronacher.
:license: BSD, see LICENSE for more details.
"""
# $ mkdir flaskr
# $ cd flaskr
# $ virtualenv env
# $ source env/bin/activate
# $ pip install Flask
# $ pip install couchdbkit
# $ python
# >>> import flaskr
# >>> flaskr.init_db()
# >>> quit()
# $ python flaskr.py
# http://localhost:5000/
# http://localhost:5984/_utils/database.html?flaskr
from flask import Flask, request, session, g, redirect, url_for, abort, \
render_template, flash
import datetime
from couchdbkit import Document, StringProperty, DateTimeProperty
import couchdbkit
import logging
# configuration
DATABASE = 'flaskr'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'
# create our little application :)
app = Flask(__name__)
app.config.from_object(__name__)
app.config.from_envvar('FLASKR_SETTINGS', silent=True)
# ppa:randall-leeds/couchdb
# $ apt-get update
# $ sudo apt-get install couchdb
def connect_db():
"""Returns a new connection to the database."""
server = couchdbkit.Server()
return server.get_or_create_db(app.config['DATABASE'])
# $ python
# >>> from flaskr import init_db
# >>> init_db()
def init_db():
"""Creates the database views."""
db = connect_db()
loader = couchdbkit.loaders.FileSystemDocsLoader('_design')
loader.sync(db, verbose=True)
class Entry(Document):
author = StringProperty()
date = DateTimeProperty()
title = StringProperty()
text = StringProperty()
@app.before_request
def before_request():
"""Make sure we are connected to the database each request."""
g.db = connect_db()
Entry.set_db(g.db)
@app.teardown_request
def teardown_request(exception):
"""Closes the database again at the end of the request."""
# if hasattr(g, 'db'):
# g.db.close()
# couchdbkit close ?
@app.route('/')
def show_entries():
# ? entries = Entry.view('entry/all')
entries = g.db.view('entry/all', schema=Entry)
app.logger.debug(entries.all())
return render_template('show_entries.html', entries=entries)
@app.route('/add', methods=['POST'])
def add_entry():
if not session.get('logged_in'):
abort(401)
app.logger.debug('before')
entry = Entry(author='test', title=request.form['title'], text=request.form['text'], date=datetime.datetime.utcnow())
app.logger.debug('after')
g.db.save_doc(entry)
flash('New entry was successfully posted')
return redirect(url_for('show_entries'))
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
error = 'Invalid username'
elif request.form['password'] != app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in'] = True
flash('You were logged in')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error)
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('show_entries'))
app.debug = True
app.logger.setLevel(logging.INFO)
#logging.basicConfig(filename='example.log',level=logging.INFO)
couchdbkit.set_logging('info')
if __name__ == '__main__':
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment