Ich versuche eine WTForms custom validator zu erstellen, um nach doppelten Bild-Hashes zu suchen. Um dies zu tun, verwende ich eine verschachtelte Funktion in meinem Formvalidator. Das Problem ist, wenn ich eine Variable (Ergebnis der inneren Funktion) in der äußeren Funktion setze, alle nachfolgenden Verweise auf die äußere Variable die innere Funktion wieder aufrufen.Wie kann die Python-Funktion eine statische Variable zurückgeben?
Zum Beispiel:
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')
Wenn ohne Hash in der Datenbank ausführen, ich drucke no dupe
und das Bild hochgeladen.
Wenn jedoch die Hash in der Datenbank vorhanden ist, wenn die Ausführung if hashcheck == imghash:
ich Absturz erreicht, weil es scheint, dass imghash
get_hash()
wieder ruft und nicht einfach den Hash-String zurückkehrt, die zuvor mit imghash = get_hash()
gesetzt wurde.
Sie können unten sehen, dass das imagehash
Programm aufgerufen wird (und abstürzt) statt nur die Hash-Zeichenfolge.
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'
Ich dachte imghash = get_hash()
eine neue Instanz der Variablen von der inneren Funktion zurück gesetzt wird? Wie kann ich eine statische Variable festlegen, um gegen die innere Funktion zu arbeiten und zusätzliche Aufrufe zu vermeiden?
Ich habe auch versucht, global/nonlocal auf die innere Funktion imghash
mit gleichen Ergebnissen.
Ich bin nicht sicher, ich dir folgen. Ich vergleiche nicht innerhalb einer Sight-Klasse. Ich definiere 2 Variablen: 'imghash' wird von der inneren Funktion erzeugt, und' hashcheck' wird aus einer SQLAlchemy Abfrage erzeugt. – mrrg
Können Sie mir den Typ der Variablen Hashcheck und Imghash zeigen? –
Ah ich sehe, ich habe zwei verschiedene Variablentypen: '' und ''. Was ist der beste Weg, um die Variablen für den Vergleich zu normalisieren? –
mrrg