私は Flask の完全な初心者であり、Web アプリの作成をいじり始めています。
一意のユーザー名を強制する方法がわかりません。SQLでこれを行う方法を考えていますが、おそらくのようなものですuser_name text unique on conflict fail
が、Pythonでエラーをキャッチするにはどうすればよいですか?
または、Flask に組み込まれているこれを管理する方法はありますか?
私は Flask の完全な初心者であり、Web アプリの作成をいじり始めています。
一意のユーザー名を強制する方法がわかりません。SQLでこれを行う方法を考えていますが、おそらくのようなものですuser_name text unique on conflict fail
が、Pythonでエラーをキャッチするにはどうすればよいですか?
または、Flask に組み込まれているこれを管理する方法はありますか?
それは完全にデータベース層に依存します。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!!!'
「その後」の後の部分を 2 回実行します。最初はウェルカム メッセージが表示されますが、2 回目は表示されません。
補遺: 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 を使用できます。これはプラグインです