2017-08-14 4 views
0

Tout simplement je crée un User dans Flask-User mais je veux déterminer par programme certains champs lorsque le User est créé. A savoir, je veux attribuer le User un UUID4.Comment gérer un utilisateur par programme avant de valider la base de données dans Flask-User?

J'ai commencé avec le modèle suivant: Flask-User-starter-app

J'ai défini le champ j'ai besoin dans mon models.py:

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) 

... 

Cependant, je semble incapable de trouver un endroit où je peux intercepter l'objet utilisateur et mis user.public_uuid = uuid.uuid4().hex

J'ai essayé de le déclarer dans ma forme (bien que je me suis dit d'avance que ne fonctionnerait pas): class MyRegisterForm(RegisterForm): public_uuid = uuid.uuid4().hex

Donc je me retrouve avec une erreur que public_uuid est Null lors de l'écriture dans la base de données.

Où puis-je gérer mon objet utilisateur avant qu'il ne soit affecté à la base de données?

Répondre

1

Vous pouvez spécifier le paramètre default de public_uuid colonne à une fonction.

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

Tout semble si évident maintenant. J'avais joué avec 'default' mais je le passais' uuid.uuid4(). Hex' directement, ce qui conduisait à créer un uuid à l'instanciation. Mais cette façon a du sens. Merci! – pyskell

0

Une solution décente qui dépend de public_uuid être annulable est d'ajouter ce qui suit à votre __init__.py ou init_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() 

Ce registres assign_public_uuid() avec le signal Flask utilisateur user_registered et dépend du package blinker en cours d'installation. Puisque user_registered n'est pas renvoyé tant que l'utilisateur n'a pas confirmé son enregistrement par e-mail et qu'il n'y a pas de signal intermédiaire (comme user_created), nous devons laisser public_uuid Nullable.

Je serais également très reconnaissant si quelqu'un a une approche qui crée l'UUID lors de l'inscription (avant la confirmation de l'e-mail) afin que l'UUID puisse avoir une contrainte non-Nullable.

Plus d'informations sur le traitement des signaux de Flask-utilisateur ici: https://pythonhosted.org/Flask-User/signals.html