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.
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
Pouvez-vous me montrer le type de variable hashcheck et imghash? –
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