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)

request.json如果您使用flask>=0.10,也不推荐使用,更好地使用request.get_json()http : //flask.pocoo.org/docs/api/#flask.Request.json 。

于 2013-10-10T08:04:47.513 回答
0

两个版本会提供相同级别的安全性吗?->没有

这不是哪个更 Pythonic 的问题,而是您想在哪个级别进行比较的问题。考虑一下,您自己就会知道答案:

>>> a = 1
>>> b = 1.0
>>> a is b
False
>>> a == b
True
>>> id(a)
12777000
>>> id(b)
14986000
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
>>> id(a)
12777000
>>> id(b)
12777000

但请注意:

>>> a=1000
>>> b=1000
>>> a is b
False

>>> a='good'
>>> b='good'
>>> a is b
True
>>> a='啊'
>>> b='啊'
>>> a is b
False
>>> a==b
True

原因是缓冲池的概念。所以,当你想比较value时,'=' 和 '!=' 更安全

id ,'is' 和 'is not' 更安全(但请注意缓冲池)

于 2013-10-10T07:13:06.250 回答