13

PHPのバックグラウンドから来て、Flaskを介してPythonを学んでいます。私はクライアントに WTForms を使用しましたが、これは検証を適切に処理します。

ただし、flask を使用したいものの 1 つはパブリック API です。この場合、すべての検証を自分のモデルで実行したいと考えています。SQLAlchemy には検証機能が含まれていると思っていましたが、そうではないようです。

見栄えの良いColanderに出くわしましたが、ユビキタスな検証ライブラリがこれ以上ないことに少し驚いています。そして、SQLAlchemy がネイティブでこれを行わないことにさらに驚いています。

ここでのオプションは何ですか?おそらく何かが足りないのですが、どうすればモデル データを簡単に検証できますか?

4

3 に答える 3

7

私はFlask-Inputsと呼ばれるこのためのライブラリを書いています。

Colander と同様に、スキーマを定義し、それらに対して入力を検証します。@Sean Vieiraの提案と同様に、検証のためにWTFormsに依存しています。

内部的には、すべてのrequest入力データを MultiDicts に変換します。WTForms と同様に、カスタム バリデーターを定義できます (組み込みのカスタム バリデーターの 1 つはrequest.jsonデータ用で、検証には jsonschema を使用します)。

パブリック API に投稿されたデータに対して検証を実行しているように聞こえるので、API キーと投稿された JSON 検証の例を次に示します。

from flask_inputs import Inputs
from flask_inputs.validators import JsonSchema

schema = {
    'type': 'object',
    'properties': {
        'name': {'type': 'string'}
    }
}

class ApiInputs(Inputs):
    headers = {
        'Authorization': [DataRequired(), valid_api_key]
    }
    json = [JsonSchema(schema=schema)]

次に、ルートで:

@app.route('/api/<version>/endpoint')
def endpoint():
    inputs = ApiInputs(request)

    if not inputs.validate():
        return jsonify(success=False, errors=inputs.errors)

私が見つけた最大の利点 (本番環境で使用) は、すべてのエラーを 1 か所で表示できることです。すべての受信データをカバーする優れたバリデーターは、本番環境での多くの予期しない/未定義の動作を防ぎます。

于 2015-10-08T20:53:21.567 に答える
2

入ってくるデータを Multi-Dict のような形式で読み取ることができる限り、検証に WTForms を使用できない理由はありません (ただし、Colander を使用するよりも少し厄介です)。

したがって、JSON を生成および使用する架空の API の場合、次のようにすることができます。

class MyDataStructure(Form):
    widget = TextField("Widget", validators=[Required()])
    quantity = IntegerField("Quantity", validators=[Required()])

@app.route("/api/v1/widgets", methods=["POST"])
def widgets():
    try:
        new_widget_info = json.loads(request.form.data)
    except KeyError:
        return jsonify(error="Must provide widget JSON in data param")
    except ValueError:
        return jsonify(error="Invalid JSON Provided")

    data = MyDataStructure(**new_widget_info)
    if not data.validate():
        return jsonify(error="Missing or invalid data",
                           error_details=data.errors)
    else:
        # Create a new widget
于 2012-07-21T03:44:03.570 に答える