Flask Python REST API在接收POST时设置可选的JSON参数

时间:2012-10-31 15:50:17

标签: python json api rest flask

我正在使用Flask构建REST API,将照片添加到数据库中。数据库在PhotoModel类中抽象化。 API接收一个JSON格式化的HTTP POST,其中包含bin字符串中的图片和名称,所有其他参数都是可选的。

如果发布的JSON中没有某个参数,如何构建“photo”对象? 在数据库Model(PhotoModel)上我只指定了两个必修项,因此只考虑JSON中存在的params的逻辑应该在下面的函数中。

def add_photo():
"""Add photo to database"""
if request.method == 'POST' and request.headers['Content-Type'] == 'application/json':
    photo = PhotoModel(
        name = request.json['name'],
        device_version = request.json['device_version'],
        date = request.json['date'],
        picture = request.json['picture'],
        comment = request.json['comment']
    )
    try:
        photo.put()
        return "200"
    except CapabilityDisabledError:
        return "500 DB read-only"
else:
    return "415 Unsupported Media Type"

我无法弄清楚如何做,任何指针都会有帮助

4 个答案:

答案 0 :(得分:1)

您可以将请求字典作为关键字参数传递给PhotoModel

photo = PhotoModel(**request.json)

答案 1 :(得分:0)

看看peewee它带有JSON中的RESTful API。它也是一个轻型ORM引擎。

答案 2 :(得分:0)

我发现了JSON Schema,它可以很好地验证JSON请求。

创建一个可用于所有视图的装饰器:

from functools import update_wrapper

from jsonschema import validate as jsonschema_validate

def validate(schema):
    def decorator(f):
        def wrapped_function(*args, **kwargs):
            # Validate request Content Type
            if request.json is None:
                raise ValidationError("Content Type must be JSON")
            # Validate document
            jsonschema_validate(request.json, schema)
            return f(*args, **kwargs)
        return update_wrapper(wrapped_function, f)
    return decorator

为您的观点使用装饰器:

@app.route('/', methods=['POST'])
@validate(schema)
def insert_document():
    # now your request.json object is validated against the specified schema

答案 3 :(得分:0)

data = request.get_json() #You can use any method here. 

#Below the required parameters outside the try

email=data['email']
role=data['role']
try:
   #Here are the optional json parameters inside a try
   firstname = data['firstname']
   lastname = data['lastname']
except KeyError:
   #Here handle the exception, maybe parse some default values. 
   pass