【问题标题】:django - combine the output of json viewsdjango - 结合 json 视图的输出
【发布时间】:2018-07-28 10:50:45
【问题描述】:

我写了一个简单的 json api,我使用一个基类,我主要为每个模型类写一个 api 视图。我想要的是将少量视图的输出合并到一个 url 端点中,并使用尽可能少的附加代码。

代码:

# base class
class JsonView(View):
   def get(self, request):
        return JsonResponse(self.get_json())
   def get_json(self):
        return {}

class DerivedView(JsonView):
   param = None
   def get_json(self):
      # .. use param..
      return {'data': []}

urls.py:

url('/endpoint1', DerivedView.as_view(param=1))
url('/endpoint2', DerivedView2.as_view())

# What I want:
url('/combined', combine_json_views({
   'output1': DerivedView.as_view(param=1),
   'output2': DerivedView2.as_view()
}))

所以/combined 会给我以下 json 响应:

{'output1': {'data': []}, 'output2': output of DerivedView2}

这就是 combine_json_views 的实现方式:

def combine_json_views(views_dict):
   d = {}
   for key, view in views_dict.items():
      d[key] = view()  # The problem is here
   return json.dumps(d)

问题是调用view() 给了我编码的json,所以再次调用json.dumps 会给出无效的json。我可以打电话给json.loads(view()),但是解码我刚刚编码的 json 看起来很糟糕。

如何在此处修改代码(可能是更好的基类),同时保持其优雅和简短?无需添加太多代码。有没有办法访问用于构造JsonResponse的数据(dict)?

【问题讨论】:

    标签: python json django api views


    【解决方案1】:

    您可以创建一个组合视图,调用get_json() 方法并将它们组合起来:

    class CombinedView(JsonView):
      def get_json(self):
        view1 = DerivedView(param=1)
        view2 = DerivedView2()
    
        d = view1.get_json()
        d.update(view2.get_json())
        return d
    

    然后:

    url('/combined', CombinedView.as_view()),
    

    【讨论】:

    • 这对我有帮助,我不知道我可以像普通对象一样调用 View 类。我的意思是,使用构造函数。我认为只有 as_view() 是使用基于类的视图的方法。所以我设法按照你的建议写了它。谢谢
    • 编辑:如果我需要 get_json() 方法中的请求怎么办? view1.get_json() 在这种情况下不起作用
    • 相信你可以指定方法为def get_json(self,request)来获取请求对象。您必须在所有视图上执行此操作 - Base、Derived 1&2 和 Combined。
    • 我可以用对象而不是 json 来做吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多