Frage

Der springende Punkt

Ich versuche, mit Flask eine ziemlich einfache Website zu erstellen (Noob!) und habe Probleme mit dem Benutzeranmeldesystem.Ich habe beschlossen, Flask-Login, Flask-BrowserID (Mozilla Persona) und SQLAlchemy zu verwenden.Ich werde Persona der Teil sein lassen, der sich um das Speichern von Benutzerkennwörtern kümmert und so, ich werde Flask-Login verwenden, sobald der Benutzer authentifiziert wurde, um seine Sitzungen zu verfolgen, und ich werde SQLAlchemy verwenden, um alles in einem zu speichern sqlite3 db.Ich habe viel herumgesprungen und ich glaube, ich habe diese Funktionen fast fertiggestellt, aber ich kann anscheinend keinen bestimmten Fehler zurückbekommen.

Aktualisierung 1

Aufgrund des Kommentars von davidism musste ich db hinzufügen.Modell für die Benutzerklasse.Leider hat das den ersten Fehler behoben, aber jetzt gibt es einen neuen zu beheben.Traceback unten gefunden.

Frage

Was gibt es?Mir fehlt offensichtlich etwas, aber ich kann anscheinend nicht finden, was das ist.

Ressourcen, mit denen ich gearbeitet habe

Zusätzliche Informationen

Hier ist mein main.py und Index.html, das ich mit Flask verwende, und der Rückverfolgung, die ich bekomme:

MAIN.py

import sqlite3
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
from contextlib import closing
import time
from flask.ext.login import LoginManager, UserMixin
from flaskext.browserid import BrowserID
from flask.ext.sqlalchemy import SQLAlchemy

## SETUP
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/flaskr.db'
db = SQLAlchemy(app)
app.config.from_object(__name__)

app.config['BROWSERID_LOGIN_URL'] = "/login"
app.config['BROWSERID_LOGOUT_URL'] = "/logout"
app.config['SECRET_KEY'] = "deterministic"
app.config['TESTING'] = True

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.UnicodeText, unique=True)
    firstname = db.Column(db.Unicode(40))
    lastname = db.Column(db.Unicode(40))
    date_register = db.Column(db.Integer)
    bio = db.Column(db.Text)
    facebook = db.Column(db.Unicode(1000))
    twitter = db.Column(db.Unicode(1000))
    website = db.Column(db.Unicode(1000))
    image = db.Column(db.LargeBinary)

    def __init__(self, email, firstname=None, lastname=None, date_register=None, bio=None, facebook=None, twitter=None, 
                    website=None, image=None):
        self.email = email
        self.firstname = firstname
        self.lastname = lastname
        self.date_register = time.time()
        self.bio = bio
        self.facebook = facebook
        self.twitter = twitter
        self.website = website
        self.image = image
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.email

### Login Functions ###
def get_user_by_id(id):
    """
    Given a unicode ID, returns the user that matches it.
    """
    for row in db.session.query(User).filter(User.id == id):
        if row is not None:
            return row.User
    return None

def create_browserid_user(kwargs):
    """
    Takes browserid response and creates a user.
    """
    if kwargs['status'] == 'okay':
        user = User(kwargs['email'])
        db.session.add(user)
        db.session.commit()
        return user
    else:
        return None

def get_user(kwargs):
    """
    Given the response from BrowserID, finds or creates a user.
    If a user can neither be found nor created, returns None.
    """
    import pdb; pdb.set_trace()
    # try to find the user
    for row in db.session.query(User).filter(User.email == kwargs.get('email')):
        if row is not None:
            return row.User
    for row in db.session.query(User).filter(User.id == kwargs.get('id')):
        if row is not None:
            return row.User
    # try to create the user
    return create_browserid_user(kwargs)

login_manager = LoginManager()
login_manager.user_loader(get_user_by_id)
login_manager.init_app(app)

browserid = BrowserID()
browserid.user_loader(get_user)
browserid.init_app(app)

### Routing ###
@app.route('/')
def home():
    return render_template('index.html')

if __name__ == '__main__':
    app.run()

INDEX.HTML

<html>
    <head>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
        <script src="https://login.persona.org/include.js" type="text/javascript"></script>
        <script type="text/javascript">{{ auth_script|safe }}</script>
    </head>
    <body>
        {% if current_user.is_authenticated() %}
            <button id="browserid-logout">Logout</button>
        {% else %}        
            <button id="browserid-login">Login</button>
        {% endif %}
    </body>
</html>

Rückverfolgung

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/jzeller/Classes/CS494/main.py", line 106, in home
    return render_template('test.html')
  File "/Library/Python/2.7/site-packages/flask/templating.py", line 123, in render_template
    ctx.app.update_template_context(context)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 692, in update_template_context
    context.update(func())
  File "/Library/Python/2.7/site-packages/flask_login.py", line 799, in _user_context_processor
    return dict(current_user=_get_user())
  File "/Library/Python/2.7/site-packages/flask_login.py", line 768, in _get_user
    current_app.login_manager._load_user()
  File "/Library/Python/2.7/site-packages/flask_login.py", line 348, in _load_user
    return self.reload_user()
  File "/Library/Python/2.7/site-packages/flask_login.py", line 312, in reload_user
    user = self.user_callback(user_id)
  File "/Users/jzeller/Classes/CS494/main.py", line 60, in get_user_by_id
    print "get_user_by_id - " + str(type(row.User)) + " - " + str(row.User)
AttributeError: 'User' object has no attribute 'User'
War es hilfreich?

Lösung

Antwort auf die ursprüngliche Frage

Der User modell muss eine Unterklasse von sein db.Model (oder eine zugeordnete Klasse), um mit SQLAlchemy zu arbeiten.

class User(UserMixin, db.Model):
    ...

Antwort auf das erste Update

Sie scheinen nicht zu verstehen, was von der Sitzung zurückgegeben wird.Abfrage.Wenn Sie ein einzelnes Modell abfragen, sind die zurückgegebenen "Zeilen" Instanzen des Modells.Die Zeilen werden niemals Keine sein.Wenn Sie nach Existenz suchen, sollten Sie einfach verwenden .first() wenn Sie Filter anwenden oder .get(primary_key) wenn Sie nach Primärschlüssel filtern.Dies liefert nur das erste Ergebnis, da die Benutzer sowieso eindeutig sind

Das ist was dein get_user_by_id sollte so aussehen:

def get_user_by_id(id):
    return User.query.get(id)

Das ist was dein get_user sollte so aussehen:

def get_user(kwargs):
    u = User.query.filter(db.or_(
        User.id == kwargs.get('id'),
        User.email == kwargs.get('email')
    )).first()
    if u is None: # user didn't exist in db
        return create_browserid_user(kwargs)
    return u
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top