1
试图更新代码,我得到一个错误:在Python 2.7 https://github.com/thrisp/flask-security至3.3SQLAlchemy的:类型错误:unhashable类型创建实例,SQLAlchemy的
给出以下最基础的情况下
test.py:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.security import Security, UserMixin, RoleMixin, \
SQLAlchemyUserDatastore
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
db = SQLAlchemy(app)
db.drop_all()
roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
last_login_at = db.Column(db.DateTime())
current_login_at = db.Column(db.DateTime())
last_login_ip = db.Column(db.String(100))
current_login_ip = db.Column(db.String(100))
login_count = db.Column(db.Integer)
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
db.create_all()
app.security = Security(app, datastore=SQLAlchemyUserDatastore(db, User, Role))
ds = app.extensions['security'].datastore
def create_roles():
for role in ('admin', 'editor', 'author'):
ds.create_role(name=role)
ds.commit()
create_roles()
def create_users(count=None):
users = [('[email protected]', 'password', ['admin'], True),
('[email protected]', 'password', ['editor'], True),
('[email protected]', 'password', ['admin', 'editor'], True),
('[email protected]', 'password', ['author'], True),
('[email protected]', 'password', [], False)]
count = count or len(users)
for u in users[:count]:
pw = u[1]
ds.create_user(email=u[0], password=pw,
roles=u[2], active=u[3])
ds.commit()
create_users(1)
导致错误:
Traceback (most recent call last):
File "test.py", line 62, in <module>
create_users(1)
File "test.py", line 59, in create_users
roles=u[2], active=u[3])
File "/media/lxch/686e26f8-c6d4-4448-8fe4-c19802726dcb/projects/current/public/flask-security/flask_security/datastore.py", line 164, in create_user
user = self.user_model(**self._prepare_create_user_args(**kwargs))
File "<string>", line 4, in __init__
File "/home/lxch/.virtualenvs/p3/lib/python3.3/site-packages/sqlalchemy/orm/state.py", line 200, in _initialize_instance
return manager.original_init(*mixed[1:], **kwargs)
File "/home/lxch/.virtualenvs/p3/lib/python3.3/site-packages/sqlalchemy/ext/declarative/base.py", line 425, in _declarative_constructor
setattr(self, k, kwargs[k])
File "/home/lxch/.virtualenvs/p3/lib/python3.3/site-packages/sqlalchemy/orm/attributes.py", line 303, in __set__
instance_dict(instance), value, None)
File "/home/lxch/.virtualenvs/p3/lib/python3.3/site-packages/sqlalchemy/orm/attributes.py", line 1001, in set
lambda adapter, i: adapter.adapt_like_to_iterable(i))
File "/home/lxch/.virtualenvs/p3/lib/python3.3/site-packages/sqlalchemy/orm/attributes.py", line 1036, in _set_iterable
collections.bulk_replace(new_values, old_collection, new_collection)
File "/home/lxch/.virtualenvs/p3/lib/python3.3/site-packages/sqlalchemy/orm/collections.py", line 803, in bulk_replace
constants = existing_idset.intersection(values or())
File "/home/lxch/.virtualenvs/p3/lib/python3.3/site-packages/sqlalchemy/util/_collections.py", line 558, in intersection
result._members.update(self._working_set(members).intersection(other))
TypeError: unhashable type: 'Role'
我正在试图理解为什么以及到底是什么:
类型错误:unhashable类型:“角色”
知道的任何见解。
那么很可能意味着不管是'SQLAlchemyUserDatastore(db,User,Role)'还是'create_user()'方法被使用的方式都是错误的,因为我假定这个包想要将'Role'对象添加到一个集合(和一个'Role '对象可能是可散列的)。似乎它试图将'Role'类本身添加到集合中。 – zzzeek
我刚刚看了一遍---我会检查一下,这是我从当前知识库中没有考虑到的。 – blueblank
我在这个功能上做了一些奇怪的事情。我已经为该项目启动了一个py3分支并更新了该函数以解决该问题:https://github.com/mattupstate/flask-security/blob/py3/tests/test_app/__init__.py#L138-L146 –