使用 py 去调用 restful 过程中产生的一些问题.

2017-07-17 00:44:04 +08:00
 coolerku

大家好,py 新手一个. 因工作需要,最近在用 py 的 requests 去调用一个系统的 restful api,写的过程中有些小疑问.同时也深感自己 py 功力的不足. 希望路过的大佬能就下面的问题,例子指点下 .多多包涵, 谢谢!

  1. 像 TestA 下 create 方法中的 data 参数, 目前指定了几个参数. 但是个人考虑到将来可能需要操作到其他参数, 打算先定义好一个 dict, 里面包括所有官方参数及对应默认值(平均 20-30 个参数吧).如果用户有输入某个指定参数,则有**kwargs 接收该参数,然后更新这个 dict. 然后不用 data. 请问各位大佬这样写好吗?或者有什么好的建议呢??

  2. 对于这个调用的 py, 个人思路是写一个通用的父类方法, 然后子类去继承. 再根据不同对象,更新不同的参数, 最后直接调用该子类即可.但是发现好像老是在重复写一些东西, 感觉不简洁, 很笨.麻烦大佬就下面的代码指点下, 应该从哪些方面来优化下. 或者说下小弟的不足之处, 指点下学习的方向.

附简易代码 (命名临时随便写的) :

# 通用方法

class Base(object):

    def read(self, module_name, data, object_name=None, key_name=None):
         url = self.generate_addr(module_name, object_name, key_name)
         res = self.session.get(url)
         return res

    def create(self, module_name, data, object_name=None, key_name=None):
         url = self.generate_addr(module_name, object_name, key_name)
         res = self.session.post(url, data=data)
         return res

# 具体对象

class TestA(Base):

    def __init__(self, address, **kwargs):
        super(TestA, self).__init__(address, **kwargs)
        self.test_module = 'test'

    def read(self, **kwargs): 
        url = self.generate_addr(self.test_module, **kwargs)
        res = self.session.get(url)
        return res

    def create(self, data, **kwargs):
        # 用于生成系统所需的数据
        def create_data(data):
            def data_one():
                payload = {'b':'2'}
                payload['a'] = data['1']
                return {'module_name':self.test_module, 'payload':payload, 'key_index':None}
            def data_two():
                module_name = 'another_test'
                payload = {}
                payload['a1'] = data['1']
                key_index = 1 
                return {'module_name':module_name, 'payload':payload, 'key_index':key_index}
            return data_one(), data_two()

        items = create_data(data)
        # 此处有想过用列表生成式, 但感觉不好写
        res_dict = []
        for item in items:
            url = self.generate_addr(item['module_name'],key_name=item['key_index'])
            res = self.session.post(url, data=item['payload'])
            res_dict.append(res)
        return res_dict
1742 次点击
所在节点    Python
1 条回复
coolerku
2017-07-17 20:16:32 +08:00
:(

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/375790

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX