2017-08-14 5 views
0

Flask-UserでUserを作成していますが、Userが作成されたときに特定のフィールドをプログラムで決定したいと考えています。つまり、UserにUUID4を割り当てたいとします。Flask-Userでデータベースにコミットする前にユーザーをプログラムで処理する方法はありますか?

私は次のテンプレートを開始しました

:私はどこ私ができる場所を見つけることができないように見えるしかし

class User(db.Model, UserMixin): 
__tablename__ = 'users' 
id = db.Column(db.Integer, primary_key=True) 

... 

public_uuid = db.Column(db.String(32), nullable=False, unique=True) 

... 

:私は私のmodels.pyに必要なフィールドを定義したFlask-User-starter-app

ユーザーオブジェクトをインターセプトし、(私は動作しませんので、予め考え出しが)私は自分の形でそれを宣言しようとしましたuser.public_uuid = uuid.uuid4().hex

設定:class MyRegisterForm(RegisterForm): public_uuid = uuid.uuid4().hex

したがって、データベースに書き込むときにpublic_uuidがNullであるというエラーが発生します。

ユーザオブジェクトをDBにコミットする前に、そのユーザオブジェクトをどこで処理できますか?

答えて

1

あなたは関数にpublic_uuid列のdefaultパラメータを指定することができます。

def generate_uuid(): 

    return uuid.uuid4().hex 

class User(db.Model, UserMixin): 

    # ... 

    public_uuid = db.Column(db.String(32), nullable=False, unique=True, default=generate_uuid) 
+0

これですべてが明らかになったようです。私は 'default'で遊んでいましたが、' uuid.uuid4().hex 'を直接渡していたので、インスタンス化時に1つのuuidが作成されていました。しかし、この方法は理にかなっています。ありがとう! – pyskell

0

public_uuidさNULL可能に依存してまともな解決策は、あなたの__init__.pyinit_app.pyに以下を追加することです:

from flask import Flask 

app = Flask(__name__)   # The WSGI compliant web application object 
... 
@user_registered.connect_via(app) 
def assign_public_uuid(sender, user, **extra): 
    user.public_uuid = str(uuid.uuid4().hex) 
    db.session.commit() 

これは、フラスコ・ユーザ信号user_registeredassign_public_uuid()を登録し、インストールされているblinkerパッケージに依存します。 user_registeredは、ユーザーが電子メールによる登録を確認し、中間信号(user_createdなど)がない限り、起動されないため、public_uuidはnullにする必要があります。

UUIDがNullableでない制約を持つことができるように、サインアップ(電子メールの確認の前に)でUUIDを作成する方法がある人は非常に感謝しています。ここでフラスコ-ユーザーの信号を扱う上

さらに詳しい情報:https://pythonhosted.org/Flask-User/signals.html

関連する問題