2017-09-18 3 views
-1

J'essaye de construire un WTForms custom validator pour vérifier des hachages d'image en double. Pour ce faire, j'utilise une fonction imbriquée dans mon validateur de formulaire. Le problème est que lorsque je définis une variable (résultat de la fonction interne) dans la fonction externe, toute référence ultérieure à la variable externe appelle à nouveau la fonction interne.Comment rendre la fonction Python retourne une variable statique?

Par exemple:

def dupe_check(self, field): 
    def get_hash(): 
     f = field.data 
     img = Image.open(f) 
     imghash = imagehash.dhash(img) 
     f.seek(0) 
     return imghash 
    imghash = get_hash() 
    hashcheck = Sights.query.filter(Sights.image_hash == imghash).first() 
    if hashcheck == imghash: 
     print('dupe') 
     raise ValidationError('duplicate hash!') 
    else: 
     print('no dupe') 

si elle est exécutée sans hachage dans la base de données, j'imprimer no dupe et l'image est téléchargée.

Cependant, si le hachage existe dans la base de données, lors de l'exécution atteint accident if hashcheck == imghash: I car il semble que imghash appelle à nouveau get_hash() et non pas simplement retourner la chaîne de hachage qui a été précédemment réglé avec imghash = get_hash().

Vous pouvez voir ci-dessous que le programme imagehash est appelé (et se bloque) au lieu de simplement la chaîne de hachage.

127.0.0.1 - - [17/Sep/2017 17:49:36] "POST /add HTTP/1.1" 500 - 
Traceback (most recent call last): 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1985, in wsgi_app 
    response = self.handle_exception(e) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1540, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/mrrg/dev/flaskimg/project/sights/views.py", line 74, in add_image 
    if form.validate_on_submit(): 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/flask_wtf/form.py", line 101, in validate_on_submit 
    return self.is_submitted() and self.validate() 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/form.py", line 310, in validate 
    return super(Form, self).validate(extra) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/form.py", line 152, in validate 
    if not field.validate(self, extra): 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/fields/core.py", line 204, in validate 
    stop_validation = self._run_validation_chain(form, chain) 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/wtforms/fields/core.py", line 224, in _run_validation_chain 
    validator(form, self) 
    File "/home/mrrg/dev/flaskimg/project/sights/forms.py", line 71, in dupe_check 
    if hashcheck == imghash: 
    File "/home/mrrg/dev/flaskimg/venv/lib/python3.5/site-packages/imagehash/__init__.py", line 85, in __eq__ 
    return numpy.array_equal(self.hash.flatten(), other.hash.flatten()) 
AttributeError: 'Sights' object has no attribute 'hash' 

Je pensais que imghash = get_hash() fixeront une nouvelle instance de la variable renvoyée par la fonction intérieure? Comment puis-je définir une variable statique à utiliser et éviter les appels supplémentaires à la fonction interne?

J'ai également essayé de définir global/nonlocal sur la fonction interne imghash avec les mêmes résultats.

Répondre

0

Si je comprends bien votre code essaie de comparer un objet vue à un objet ImageHash, mais le code de classe Sight mise en œuvre compare seulement entre 2 objet vue seulement, si l'erreur apparaît

+0

Je ne suis pas sûr que je vous suis. Je ne compare pas dans une classe de vue. Je définis 2 variables: 'imghash' est créé à partir de la fonction interne, et' hashcheck' est créé à partir d'une requête SQLAlchemy. – mrrg

+0

Pouvez-vous me montrer le type de variable hashcheck et imghash? –

+0

Ah je vois, j'ai deux types de variables différents: '' et ''. Quelle est la meilleure façon de normaliser les variables pour la comparaison? – mrrg