2015-07-23 2 views
0

У меня есть большая база данных, построенная и заполненная sqlalchemy (оригинал - не флакон-SQLAlachemy). Я хотел бы добавить флеш-безопасность на сайт, и я понимаю, что он полагается на flask-SQLAlachemy (вместо оригинала), но я понимаю (просто начал пытаться узнать больше об этом), что flask-SQLAlchemy может работать с оригинал. Ввод пользователей в базу данных, похоже, сработает. Когда я перехожу на ограниченную страницу, мне предлагается войти (как и должно). При вводе правильного адреса электронной почты и пароля я получаю ошибку AttributeError: type object 'User' has no attribute 'query', а поскольку трассировка ошибки не ссылается ни на один из моих кодов, я не уверен, как ее разрешить.AttributeError: type object 'User' не имеет атрибута 'query'

Думая, что это была проблема sqlalchemy для проблемы с конверсией SQL-конверсии, я чувствую, что я пробовал все, кроме создания новой базы данных. Я не нашел ничего в документации по фляге или фляге SQLAlchemy, чтобы помочь решить эту проблему. У кого-нибудь есть идея, как это решить?

Вот мой код:

testing.py

from flask import Flask, render_template 
from sqlalchemy import create_engine, asc, and_, or_, func, desc 
from sqlalchemy.orm import sessionmaker 
import database_setup 
from database_setup import Base, User, Role 
from flask_sqlalchemy import SQLAlchemy 
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin, login_required 

application.config['SECRET_KEY'] = 'super-secret' 

# Setup Flask-Security 
user_datastore = SQLAlchemyUserDatastore(database_setup, User, Role) 
security = Security(application, user_datastore) 

engine = create_engine('sqlite:///landtohuntalpha.db') 
Base.metadata.bind = engine 

DBSession = sessionmaker(bind=engine) 
session = DBSession() 

@application.route('/user/add/', methods = ['GET','POST']) 
def addUser(): 
if request.method == 'POST': 
    submission = User(
     email = request.form['email'], 
     password = request.form['password'], 
    ) 
    session.add(submission) 
    session.commit() 
    return redirect(url_for('completedUser')) 
else: 
    return render_template('addUser.html') 

@application.route('/restricted_page/') 
@login_required 
def restrictedPage(): 
    return render_template('restricted_page.html') 

database_setup.py

import os 
import sys 
from sqlalchemy import Column, ForeignKey, Integer, String, DateTime, Boolean, Float, Date, Table 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship 
from sqlalchemy import create_engine 
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin, login_required 

Base = declarative_base() 

roles_users = Table('roles_users', Base.metadata, Column('user_id', Integer, ForeignKey('user.id')), Column('role_id', Integer, ForeignKey('role.id'))) 

class Role(Base, RoleMixin): 
    __tablename__ = 'role' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(80), unique=True) 
    description = Column(String(255)) 

class User(Base, UserMixin): 
    __tablename__ = 'user' 

    id = Column(Integer, primary_key=True) 
    email = Column(String(250), nullable=False) 
    password = Column(String(30)) 
    last_login_at = Column(DateTime) 
    active = Column(Boolean) 
    confirmed_at = Column(DateTime) 
    current_login_at = Column(DateTime) 
    last_login_ip = Column(String(45)) 
    current_login_ip = Column(String(45)) 
    login_count = Column(Integer) 

Traceback Ошибка

File "C:\Python34\lib\site-packages\flask\app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
File "C:\Python34\lib\site-packages\flask\app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
File "C:\Python34\lib\site-packages\flask\app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
File "C:\Python34\lib\site-packages\flask\_compat.py", line 33, in reraise 
    raise value 
File "C:\Python34\lib\site-packages\flask\app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
File "C:\Python34\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
File "C:\Python34\lib\site-packages\flask\app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
File "C:\Python34\lib\site-packages\flask\_compat.py", line 33, in reraise 
    raise value 
File "C:\Python34\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
File "C:\Python34\lib\site-packages\flask\app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
File "C:\Python34\lib\site-packages\flask_security\decorators.py", line 205, in wrapper 
    return f(*args, **kwargs) 
File "C:\Python34\lib\site-packages\flask_security\views.py", line 75, in login 
    if form.validate_on_submit(): 
File "C:\Python34\lib\site-packages\flask_wtf\form.py", line 166, in validate_on_submit 
    return self.is_submitted() and self.validate() 
File "C:\Python34\lib\site-packages\flask_security\forms.py", line 230, in validate 
    self.user = _datastore.get_user(self.email.data) 
File "C:\Python34\lib\site-packages\flask_security\datastore.py", line 191, in get_user 
    rv = self.user_model.query.filter(query).first() 
AttributeError: type object 'User' has no attribute 'query' 
+0

проблема, кажется, с установкой DB соединения ... @ Марк –

+0

@upaangsaxena Я не уверен, что это не так с соединением. Можете ли вы уточнить? благодаря –

ответ

3

Ваш пользовательский класс наследуется от UserMixin (из фляги-входа), у которого нет атрибута запроса. не может полностью объяснить различия между нашими проектами, но вот моя основная установка:

INIT .py:

from flask import Flask, render_template, session 
from flask.ext.sqlalchemy import SQLAlchemy 
import flask.ext.login as FL 


# define the main app object 
app = Flask(__name__) 
app.config.from_object('config') 
app.secret_key = 'super secret string' 

login_manager = FL.LoginManager() 
login_manager.init_app(app) 
login_manager.login_view = "/" 

# create the database object 
db = SQLAlchemy(app) 

затем в models.py (убедитесь, что вы импортировать БД) составляют класс пользователя наследоваться от db.Model:

from flasker import db 
import datetime 
from flask.ext.login import UserMixin 

class User(db.Model): 
    id = db.Column(db.Integer,primary_key=True) 
    email = db.Column(db.Unicode(128)) 
    name = db.Column(db.Unicode(128)) 
    password = db.Column(db.Unicode(1024)) 
    authenticated = db.Column(db.Boolean, default=False) 
    posts = db.relationship('Post') 
    #-----login requirements----- 
    def is_active(self): 
    #all users are active 
     return True 

    def get_id(self): 
     # returns the user e-mail. not sure who calls this 
     return self.email 

    def is_authenticated(self): 
     return self.authenticated 

    def is_anonymous(self): 
     # False as we do not support annonymity 
     return False 

    #constructor 
    def __init__(self, name=None, email=None, password=None): 
     self.name = name 
     self.email = email 
     self.password = password 
     self.authenticated = True