0

この質問の起源は、http://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flaskのフラスコ チュートリアルです。このチュートリアルを読んでいるときに、次の関数に出会いました。

@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods = ['PUT'])
def update_task(task_id):
    task = filter(lambda t: t['id'] == task_id, tasks)
    if len(task) == 0:
        abort(404)
    if not request.json:
        abort(400)
    if 'title' in request.json and type(request.json['title']) != unicode:
        abort(400)
    if 'description' in request.json and type(request.json['description']) is not unicode:
        abort(400)
    if 'done' in request.json and type(request.json['done']) is not bool:
        abort(400)
    task[0]['title'] = request.json.get('title', task[0]['title'])
    task[0]['description'] = request.json.get('description', task[0]['description'])
    task[0]['done'] = request.json.get('done', task[0]['done'])
    return jsonify( { 'task': task[0] } )

この行は、値の比較を使用しています。

if 'title' in request.json and type(request.json['title']) != unicode:

しかし、この行は同一性比較を使用しています:

if 'description' in request.json and type(request.json['description']) is not unicode:

著者が一貫していない理由はありますか?どちらのバージョンも同じレベルのセキュリティを提供しますか? もしそうなら、よりpythonicなアプローチは何ですか?

4

3 に答える 3

3

私はこの方法を好むでしょう:

if isinstance(request.json['title'], unicode):
    pass
于 2013-10-10T07:07:27.620 に答える
1

代わりにjsonスキーマを使用する方がよいと思います:

from jsonschema import validate, ValidationError

schema = {
    'type': 'object',
    'properties': {
        'title': {
            'type': 'string',
        },
        'description': {
            'type': 'string',
        },
        'done': {
            'type': 'boolean',
        },
    },
}

try:
    validate(request.get_json(), schema)
except ValidationError:
    abort(400)

また、http://flask.pocoo.org/docs/api/#flask.Request.jsonrequest.jsonを使用する場合は非推奨です。flask>=0.10request.get_json()

于 2013-10-10T08:04:47.513 に答える