私はWTForms custom validatorを作成して、重複するイメージハッシュを確認しようとしています。これを行うには、フォームバリデーターでネストされた関数を使用しています。問題は、外部関数に変数(内部関数の結果)を設定し、その後の外部変数への参照が内部関数を再度呼び出す場合です。例えばPython関数は静的変数を返すようにするには?
:
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')
、データベース内の無ハッシュを実行した場合、私はno dupe
を印刷した画像がアップロードされます。しかし
、imghash
は、単に以前imghash = get_hash()
で設定されたハッシュ文字列を返す再度ないget_hash()
を呼び出していることが表示されますので、実行がif hashcheck == imghash:
Iクラッシュに達したときに、ハッシュは、データベース内に存在する場合。
単純にハッシュ文字列ではなく、imagehash
プログラムが呼び出される(クラッシュする)ことが、以下で分かります。
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'
私はimghash = get_hash()
は、内部関数から返される変数の新しいインスタンスを設定しますと思いましたか?どのようにして動作する静的変数を設定し、内部関数への追加呼び出しを避けることができますか?
また、内部関数のimghash
でグローバル/非ローカルを同じ結果で設定しようとしました。
表示されます。理解したよう私はSightクラス内で比較していません。 2つの変数を定義します。「imghash」は内部関数から作成され、「hashcheck」はSQLAlchemyクエリから作成されます。 – mrrg
可変ハッシュチェックとインハッシュのタイプを表示できますか? –
ああ、私は二つの異なる変数型があります: ''と ''。比較のために変数を正規化する最良の方法は何ですか? –
mrrg