Flask-Login mit CouchDB
Verfasst: Dienstag 6. Dezember 2011, 20:08
Hier mal ein kleines Beispiel, wie man Flask-Login mit CouchDB verwenden kann. Verbesserungsvorschläge willkommen, Verwendung auf eigene Gefahr.
Es basiert auf dem Flask-Login Example. Zunächst das Beispiel von Bitbucket herunterladen.
Diesen Sourcecode im Verzeichnis /example unter einem beliebigen Namen abspeichern
Die Konfigurationsdaten im Verzeichnis /example unter dem Namen config.py abspeichern.
Diese Datei dient lediglich dazu, die Demo Daten auf dem Server zu speichern
Das Template login.html wurde um ein Passwort erweitert
Es basiert auf dem Flask-Login Example. Zunächst das Beispiel von Bitbucket herunterladen.
Diesen Sourcecode im Verzeichnis /example unter einem beliebigen Namen abspeichern
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Flask-Login example
===================
This is a small application that provides a trivial demonstration of
Flask-Login, including remember me functionality.
:copyright: (C) 2011 by Matthew Frazier.
:license: MIT/X11, see LICENSE for more details.
"""
from flask import Flask, request, render_template, redirect, url_for, flash
from flaskext.login import (LoginManager, current_user, login_required,
login_user, logout_user, UserMixin, AnonymousUser,
confirm_login, fresh_login_required)
from couchdb.mapping import TextField, BooleanField, Document
from flaskext.couchdb import *
class User(Document):
name = TextField()
active = BooleanField(default=True)
password = TextField()
def is_active(self):
return self.active
def is_anonymous(self):
return False
def is_authenticated(self):
return True
def get_id(self):
try:
return unicode(self.name)
except AttributeError:
raise NotImplementedError("No `id` attribute - override get_id")
class Anonymous(AnonymousUser):
name = u"Anonymous"
app = Flask(__name__)
app.config.from_object('config')
couch_manager = CouchDBManager()
couch_manager.setup(app)
login_manager = LoginManager()
login_manager.anonymous_user = Anonymous
login_manager.login_view = "login"
login_manager.login_message = u"Please log in to access this page."
login_manager.refresh_view = "reauth"
login_manager.setup_app(app)
@login_manager.user_loader
def load_user(id):
return User.load(id)
@app.route("/")
def index():
return render_template("index.html")
@app.route("/secret")
@fresh_login_required
def secret():
return render_template("secret.html")
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST" and "username" in request.form and "passwd" in request.form:
username = request.form["username"]
passwd = request.form["passwd"]
user = User.load(username)
if user and user.password == passwd:
remember = request.form.get("remember", "no") == "yes"
if login_user(user, remember=remember):
flash("Logged in!")
return redirect(request.args.get("next") or url_for("index"))
else:
flash("Sorry, but you could not log in.")
else:
flash(u"Invalid username or password.")
return render_template("login.html")
@app.route("/reauth", methods=["GET", "POST"])
@login_required
def reauth():
if request.method == "POST":
confirm_login()
flash(u"Reauthenticated.")
return redirect(request.args.get("next") or url_for("index"))
return render_template("reauth.html")
@app.route("/logout")
@login_required
def logout():
logout_user()
flash("Logged out.")
return redirect(url_for("index"))
if __name__ == "__main__":
app.run(host='0.0.0.0')
Code: Alles auswählen
COUCHDB_SERVER = "http://localhost:5984"
COUCHDB_DATABASE = "mydb"
SECRET_KEY = "yeah, not actually a secret"
DEBUG = True
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import couchdb
from couchdb.mapping import TextField, BooleanField, Document
from uuid import uuid4
class User(Document):
name = TextField()
active = BooleanField(default=True)
password = TextField()
type = TextField(default="User")
couch = couchdb.Server()
try:
db = couch.delete("mydb")
db = couch.create("mydb")
except:
db = couch.create("mydb")
u=User(name = u"Notch", password = u"ü")
u.id = u"Notch"
u.store(db)
u=User(name = u"Steve", password = u"b")
u.id = u"Steve"
u.store(db)
u=User(name = u"Creeper", active = False, password = u"c")
u.id = u"Creeper"
u.store(db)
Code: Alles auswählen
{% extends "layout.html" %}
{% block body %}
<h2>Login</h2>
<form action="" method=post>
<dl>
<dt>Username:
<dd><input type=text name=username>
<dt>Password:
<dd><input type=text name=passwd>
<dt>Remember Me:
<dd><input type=checkbox name=remember value=yes>
<dd><input type=submit value=Login>
</dl>
</form>
{% endblock %}