1

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

如果发布的 JSON 中不存在某些参数,如何构造“照片”对象?在数据库模型(PhotoModel)上,我只指定了两个强制性项目,因此只考虑 JSON 中存在的参数的逻辑应该在下面的函数中。

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

3 回答 3

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
于 2014-02-20T12:38:49.447 回答
0

看看peewee,它带有一个 JSON 格式的 RESTful API。它也是一个轻量级的 ORM 引擎。

于 2012-12-30T05:40:57.143 回答
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
于 2018-08-04T03:28:04.073 回答