2017-09-18 4 views
-1

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 imghashget_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.

Antwort

0

Wie ich verstehe Ihr Code versucht, nur ein Sight-Objekt zu einem ImageHash Objekt, aber der Anblick Klasse Codeimplementierung vergleicht nur zwischen 2 Sight-Objekt verglichen werden, so dass der Fehler

erscheint
+0

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

+0

Können Sie mir den Typ der Variablen Hashcheck und Imghash zeigen? –

+0

Ah ich sehe, ich habe zwei verschiedene Variablentypen: '' und ''. Was ist der beste Weg, um die Variablen für den Vergleich zu normalisieren? – mrrg

Verwandte Themen