我是 Flask 的初学者,并且开始尝试制作网络应用程序。
我很难弄清楚如何强制使用唯一的用户名。我正在考虑如何在 SQL 中执行此操作,可能使用类似的东西user_name text unique on conflict fail
,但是如何在 Python 中捕获错误?
或者,有没有办法管理这个内置到 Flask 中?
我是 Flask 的初学者,并且开始尝试制作网络应用程序。
我很难弄清楚如何强制使用唯一的用户名。我正在考虑如何在 SQL 中执行此操作,可能使用类似的东西user_name text unique on conflict fail
,但是如何在 Python 中捕获错误?
或者,有没有办法管理这个内置到 Flask 中?
这完全取决于您的数据库层。尽管推荐使用 SQL Alchemy,但Flask 并没有与特定的 ORM 系统捆绑在一起。好消息是 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 与默认身份验证框架 最接近的东西只是将用户存储在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 之类的东西。
你可以使用 SQLAlchemy。它是一个插件