【问题标题】:Automatically convert JSON to Object on Flask Request根据 Flask 请求自动将 JSON 转换为对象
【发布时间】:2015-08-23 10:15:53
【问题描述】:

在 Spring MVC + Jackson (Java) 中,我可以拥有这个:

我的对象 (Java)

public class Project {

   private long id;
   private String self;
   private String key;
   private String name;

   //Getters and Setters
}

Spring MVC 控制器

...
@RequestMapping(value="/doSomething", method=RequestMethod.POST)
public String doSomething(@RequestBody Project project) {
    System.out.println(project.getName());
    return "myPage";
}
...

然后,我可以发送一个像这样的json:

{"id": "exampleId", "name": "exampleName","self": "url","key": "key"}

它会自动转换为我的对象。在 Python 上,我有我的对象类。 Flask 中有一些东西我可以调用:

烧瓶控制器

@app.route('/doSomething', methods=['POST'])
def do_something(project):
    print project.name
    return "myPage"

我的对象 (Python)

class Project():

    id=None        
    name=None
    url=None
    key=None

基本上,我想在 Flask 上接收我的 JSON 并且已经转换为我的对象。我想避免这样做:

class Project(object):
  def __init__(self, id, url, name, key):
    self.id = id
    self.url = url
    self.name = name
    self.key = key
...
import json
my_json = json.loads(request.data)
user = Project(**j)

这样,我将不得不从我的所有对象中覆盖 init。或者这样:

project = json.loads('{"__type__": "Project", "name": "project", "key": "key"}')
print project['name']
print project['key']

也不好,因为它不是我的对象,它是一个字典。

这可能吗?还是我必须选择其中之一?

【问题讨论】:

    标签: java python json spring-mvc flask


    【解决方案1】:

    据我所知,如果您必须在 Python 中使用类,我认为您无法避免添加构造函数。

    另一种选择是使用namedtuple。它们类似于元组,但具有字段名称。无论哪种方式,您都可以使用装饰器模拟您想要的内容

    例如:

    from collections import namedtuple
    Project = namedtuple('Project', 'id url name key')
    

    现在您可以在视图处理程序中执行以下操作:

    # This decorator takes the class/namedtuple to convert any JSON
    # data in incoming request to. 
    def convert_input_to(class_):
        def wrap(f):
            def decorator(*args):
                obj = class_(**request.get_json())
                return f(obj)
            return decorator
        return wrap
    
    @app.route('/doSomething', methods=['POST'])
    @convert_input_to(Project)
    def do_something(project):
        print project.name
        return "myPage"
    

    另请参阅 flask.Request.get_json 并确保将 'Content-Type' 设置为 'application/json'

    【讨论】:

    • 谢谢。这完美地工作。我只是需要调整 namedtuple 类以使用方法,所以它看起来像:class Project(namedtuple('Project', 'id url name key')): def __new__(cls, id=None, name=None, url=None, key=None): return super(Project, cls).__new__(cls, id, name, url, key)
    • 正确类:class Project(namedtuple('Project', 'id name url key')): def __new__(cls, id=None, name=None, url=None, key=None): return super(Project, cls).__new__(cls, id, name, url, key)
    • 我知道 Django Rest 框架会自动完成这类事情(一旦你有了模型,就不需要自己构造所有对象了)。在 Flask 中真的没有办法做同样的事情吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多