spiele gerade ein wenig mit der Flask extension "login" herum. Habe ein ganze einfaches Beispiel geschrieben und mich an diesem hier: https://github.com/flask-admin/flask-ad ... uth/app.py orientiert.
Code: Alles auswählen
from flask import Flask, render_template, request, session
from flask.ext.sqlalchemy import SQLAlchemy
import flask.ext.login as login
from passlib.hash import pbkdf2_sha256
app = Flask(__name__)
login_manager = login.LoginManager()
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:passwd@localhost:3307/flask_test"
app.config["SECRET_KEY"] = "123456789"
db = SQLAlchemy(app)
login_manager.init_app(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
vorname = db.Column(db.String(50))
nachname = db.Column(db.String(50))
password = db.Column(db.String(100))
email = db.Column(db.String(120), unique=True)
def __init__(self, vorname, nachname, password, email):
self.vorname = vorname
self.nachname = nachname
self.password = password
self.email = email
def __repr__(self):
return "<User %r>" %self.email
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return self.id
@login_manager.user_loader
def load_user(userid):
return User.query.filter_by(id=userid).one()
def hashnewpasswd(password):
return pbkdf2_sha256.encrypt(password, rounds=2000, salt_size=16)
def verifypasswd(aktpasswd, dbpasswd):
return pbkdf2_sha256.verify(aktpasswd, dbpasswd)
@app.route("/login", methods=["GET", "POST"])
def login():
print "login"
if request.method == "POST":
if not "email" in request.form or not "password" in request.form:
return render_template("login.html", fehler=True)
user = request.form["email"]
passwd = request.form["password"]
userrec = User.query.filter_by(email=user).all()
if not userrec:
print "Kein User gefunden"
return render_template("login.html", fehler=True)
print userrec[0]
if not verifypasswd(passwd, userrec[0].password):
print "Passwort ist falsch"
return render_template("login.html", fehler=True)
login_user(userrec[0])
return "Eingelogt"
return render_template("login.html")
if __name__ == "__main__":
app.debug = True
app.run(host="0.0.0.0")
Code: Alles auswählen
{% extends "layout.html" %}
{% block content %}
{% if fehler == True%}
<h1>Fehler</h1>
{%endif%}
<link rel="stylesheet" href="{{ url_for('static', filename='css/login.css') }}">
<div class="container">
<form class="form-signin" method="post" action="{{url_for('login')}}">
<h2 class="form-signin-heading">Please sign in</h2>
<label for="inputEmail" class="sr-only">Email address</label>
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
<label for="inputPassword" class="sr-only">Password</label>
<input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>
</div> <!-- /container -->
{% endblock %}
Wenn ich mich nun versuche einzuloggen kommt der Fehler:
Also ein wenig gegoogelt und herausbekommen, dass man das Modul "flask-security" noch braucht.Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/tom/Dokumente/web-workspace/haba-fanreisen/haba.py", line 124, in login
login_user(userrec[0])
File "/usr/local/lib/python2.7/dist-packages/flask_security/utils.py", line 64, in login_user
if _security.trackable:
File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 338, in __getattr__
return getattr(self._get_current_object(), name)
File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 297, in _get_current_object
return self.__local()
File "/usr/local/lib/python2.7/dist-packages/flask_security/utils.py", line 35, in <lambda>
_security = LocalProxy(lambda: current_app.extensions['security'])
KeyError: 'security'
Also das ganze installiert und mich in den QuickStart guide (http://pythonhosted.org/Flask-Security/quickstart.html) eingelesen und gemerkt, dass man dort sehr viel Vordefinieren muss und an viele Restriktionen gebunden ist.
Ist dies wirklich so oder übersehe ich das offensichtliche?