次のコードはカプセル化されていません。
import requests
from base_api.base import Base
class Tag(Base):
_corpsecret = "ZuqJiGA6NjxfWJOizNlcoy0F0gEgIuGyAjHXbx3Cxyo"
def __init__(self):
self.get_token(self._corpsecret)
self.data = self.api_load("../base_api/tag_api.yaml")
def add(self, tagname):
_url = 'https://qyapi.weixin.qq.com/cgi-bin/tag/create'
r = requests.post(_url,
params={"access_token": self.get_token(self._corpsecret)},
json={"tagname": tagname})
self.format(r)
return r.json()
def get(self, tagid):
return self.api_send(self.data['get'])
_url = 'https://qyapi.weixin.qq.com/cgi-bin/tag/get'
r = requests.post(_url,
params={
"access_token": self.get_token(self._corpsecret),
"tagid": tagid,
})
self.format(r)
return r.json()
def delete(self, tagid):
_url = 'https://qyapi.weixin.qq.com/cgi-bin/tag/delete'
r = requests.get(_url,
params={
"access_token": self.get_token(self._corpsecret),
"tagid": tagid,
})
self.format(r)
return r.json()
コードには多くの冗長性があることがわかり、以下はカプセル化するためにyamlデータ駆動型フォームを採用しています。
base.pyファイルの最初:
import requests
import json
import yaml
class Base:
_token = []
_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
_corpid = "wwcbefdd1de3927e42"
@classmethod
def yaml_load(cls, path):
with open(path, encoding='utf-8') as f:
return yaml.safe_load(f)
@classmethod
def format(cls, r):
cls.r = r
# print(json.dumps(r.json(), indent=2))
print(json.dumps(json.loads(r.text), indent=2, ensure_ascii=False))
def api_load(self, path):
return self.yaml_load(path)
def api_send(self, req: dict):
req['params']['access_token'] = self._token[0]
print(req)
r = requests.request(req["method"],
url=req["url"],
params=req["params"],
json=req["json"])
self.format(r)
return r.json()
@classmethod
def get_token(cls, corpsecret):
# todo 这里还可以把时间记录下来,每次调用都判读一下时间
if corpsecret not in cls._token:
res_dict = cls.get_access_token(corpsecret)
cls._token.append(res_dict["access_token"])
return cls._token[-1]
@classmethod
def get_access_token(cls, corpsecret):
_token_url_params = {
"corpid": cls._corpid,
"corpsecret": corpsecret,
}
res = requests.get(cls._token_url, params=_token_url_params)
return res.json()
getおよびpostリクエストボディに対する次のtag.pyファイルリクエストは単純になります
from base_api.base import Base
class Tag(Base):
_corpsecret = "ZuqJiGA6NjxfWJOizNlcoy0F0gEgIuGyAjHXbx3Cxyo"
def __init__(self):
self.get_token(self._corpsecret)
self.data = self.api_load("../base_api/tag_api.yaml")
def get_api(self):
pass
def add(self):
return self.api_send(self.data['add'])
def get(self):
return self.api_send(self.data['get'])
def delete(self, tagid):
return self.api_send(self.data['delete'])
次のユースケースレイヤーはよりエレガントです
from base_api.tag import Tag
from base_api import base
from base_api.group_chat import GroupChat
import pytest
class TestTag(object):
# 测试数据的测试驱动
data = base.Base.yaml_load("test_tag_data.yaml")
@classmethod
def setup_class(cls):
cls.tag = Tag()
def test_add(self, name):
r = self.tag.add()
assert r["errcode"] == 0
def test_get(self):
r = self.tag.get(3)
assert r["errcode"] == 0
def test_get_api(self):
r = self.tag.get_api()
assert r["errcode"] == 0
def test_delete(self):
r = self.tag.delete(3)
assert r["errcode"] == 0
データはtest_tag_data.yamlファイルにカプセル化されます:
get:
method: post
url: https://qyapi.weixin.qq.com/cgi-bin/tag/get
params:
access_token: ${token}
tagid: 3
json:
add:
method: post
url: https://qyapi.weixin.qq.com/cgi-bin/tag/create
params:
access_token: ${token}
tagid: 3
json:
tagname: Tencent
上記はステップドリブンパッケージです