【问题标题】:How do I enforce unique user names in Flask?如何在 Flask 中强制使用唯一的用户名?
【发布时间】:2013-09-30 05:17:22
【问题描述】:

我是 Flask 的初学者,并且开始尝试制作网络应用程序。

我很难弄清楚如何强制使用唯一用户名。我正在考虑如何在 SQL 中执行此操作,可能使用 user_name text unique on conflict fail 之类的东西,但是如何在 Python 中捕获错误?

或者,有没有办法在 Flask 中进行管理?

【问题讨论】:

  • 也许您可以在向数据库添加新记录时使用try...except... 捕获异常。
  • 是否自动捕获 SQL 错误?
  • 没有。请查看@cwallenpoole 的答案,您可以在尝试提交到数据库时捕获异常。

标签: python sql web-applications flask


【解决方案1】:

这完全取决于您的数据库层。 Flask 非常明确地与特定的 ORM 系统捆绑,但建议使用 SQL Alchemy。好消息是 SQL Alchemy 有一个独特的约束。

它的工作原理如下:

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!!!'

在“then later”之后运行该部分两次。第一次会收到欢迎信息,第二次不会。


附录:Flask 最接近default authentication frameworksimply stores users in a dict by username。检查强制唯一性的方法是手动测试,例如。

if username in digest_db:
    raise Exception('HEY! "{}" already exists! \
                     You can\'t do that'.format(username))
digest_db.add_user(username, password)

或覆盖 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 之类的东西。

【讨论】:

    【解决方案2】:

    你可以使用 SQLAlchemy。它是一个插件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-04
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多