V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
coolerku
V2EX  ›  Python

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

  •  
  •   coolerku · 2017-07-17 00:44:04 +08:00 · 1848 次点击
    这是一个创建于 2693 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,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
    
    1 条回复    2017-07-17 20:16:32 +08:00
    coolerku
        1
    coolerku  
    OP
       2017-07-17 20:16:32 +08:00 via iPhone
    :(
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2881 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:44 · PVG 11:44 · LAX 19:44 · JFK 22:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.