如何在Flask中强制使用唯一用户名?

2024-03-29 13:33:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我是烧瓶的一个完全的初学者,我开始尝试制作网络应用程序。在

我很难弄清楚如何强制使用唯一用户名。我在考虑如何在SQL中实现这一点,也许可以使用user_name text unique on conflict fail之类的东西,但是如何在Python中捕捉错误呢?在

或者,有没有一种方法来管理内置在烧瓶里的这个?在


Tags: 方法textname程序sql烧瓶on错误
2条回答

这完全取决于您的数据库层。Flask是非常特别的而不是与一个特定的ORM系统捆绑在一起,尽管建议使用SQL炼金术。好消息是SQL炼金术有一个独特的限制。在

下面是它的工作原理:

from sqlalchemy.ext.declarative import declarative_base, InvalidRequestError
engine = #my engine
session = Session() # created by sessionmaker(bind=engine)
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)

# then later...

user = User()
user.name = 'Frank'
session.add(user)

try:
    session.commit()
    print 'welcome to the club Frank'
except InvalidRequestError:
    print 'You are not Frank. Impostor!!!'

在“然后稍后”之后运行部件两次。第一次你会收到欢迎短信,第二次就不会了


附录:烧瓶最接近于default authentication frameworksimply stores users in a ^{} by username。检查执行唯一性的方法是手动测试例如

^{pr2}$

或重写RealmDigestDB以确保在添加之前进行检查:

class FlaskRealmDigestDB(authdigest.RealmDigestDB):
    def add_user(self, user, password):
        if user in self:
            raise AttributeError('HEY! "{}" already exists! \
                                  You can\'t do that'.format(user))
        super(FlaskRealmDigestDB, self).add_user(user, password)

    def requires_auth(self, f):
        # yada yada

或者重写RealmDigestDB,并使其返回不允许重复赋值的内容。例如

class ClosedDict(dict):
    def __setitem__(self, name, val):
       if name in self and val != self[name]:
          raise AttributeError('Cannot reassign {} to {}'.format(name, val))
    super(ClosedDict, self).__setitem__(name,val)


class FlaskRealmDigestDB(authdigest.RealmDigestDB):
    def newDB():
        return ClosedDict()

    def requires_auth(self, f):
        # yada yada

我把它作为一个附录放在这里,因为这个类不以任何方式持久化数据,如果您打算扩展authdigest.RealmDigestDB,那么您应该像上面一样使用SQLAlchemy。在

你可以用炼金术。它是一个插件

相关问题 更多 >