를 실행하는 방법 플라스크-로그인,플라스크-BrowserID 및 플라스크-밀한 웹 애플리케이션을 빨리 빌드에서 하모니?

StackOverflow https://stackoverflow.com//questions/21033870

문제

전체 포인트

내가 하려고 매우 기본적으로 웹사이트 플라스크(멍청한 놈!) 고 실행하는 말썽으로 사용자 로그인 시스템입니다.저는 결정했다는 내가 사용하려면 플라스크-로그인,플라스크-BrowserID(Mozilla 인물)및 정밀한 웹 애플리케이션을 빨리 빌.그 인물 일부가 될 수 있는 사용자 암호를 저장하고 나가 사용하여 플라스크에 로그인하면 사용자가 인증된 추적을 유지하의 자신의 세션과를 사용하고 정밀한 웹 애플리케이션을 빨리 빌드를 저장하는 모든 것에 sqlite3db.나는 많이 했어요 주위에 수신 거부하고 나는 생각은 거의 완성되는 이러한 기능이 있지만,나는 수가 없어 다시 얻을 수있는 특정 오류가 있습니다.

Update1

에 기반한 의견 davidism,나를 추가했습니다.모델 사용자에게 클래스입니다.불행하게도,그 해결 첫 번째 오류,하지만 지금은 새로운 하나입니다.추적 아래에 있습니다.

질문

어떤 장점이 있나요?나는 분명히 뭔가를 놓치지만,나를 찾을 수 없습니다.

리소스와 함께 일하고 있다

추가 정보

여기에 나 main.py 고 index.html 내가 사용하는을 가진 플라스크 및 추적동:

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>

추적

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'
도움이 되었습니까?

해결책

대답을 원래 질문

User 모델해야 하위 클래스 db.Model (또는 매핑된 클래스)와 함께 작동하는 정밀한 웹 애플리케이션을 빨리 빌.

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

응답을 처음 업데이트

당신이하지 않는 것이 무엇인지 이해 점점 반환에 의해 세션이 있습니다.쿼리가 있습니다.쿼리할 경우 단일 모델을 행하는 반환하의 인스턴스 모델입니다.행할 것이 결코 없습니다.당신을 위한 존재,당신은 단지 사용 .first() 면 필터를 적용하나 .get(primary_key) 로 필터링하는 경우 기본 핵심이다.이 첫 번째 결과 이후에만 사용자는 독특한 어쨌든

이것은 무엇인 get_user_by_id 해야는 다음과 같다:

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

이것은 무엇인 get_user 해야는 다음과 같다:

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top