Created
March 6, 2012 11:09
-
-
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/.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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