|
本人今天学到一个知识点,作为一个给菜鸟的科普,老鸟们不要见笑。
- #coding=utf-8
- import requests
- import json
- class op_request(object):
- def __init__(self, request, request_body):
- self.request_url = request["host"] + request["url"]
- self.method = request["method"]
- self.protocol = request["protocol"]
- self.headers = request["headers"]
- self.request_body = request_body
- def send_request(self):
- if self.method == "post" and self.protocol == "http":
- re_dict = self.http_request_post()
- return re_dict
- def http_request_post(self):
- url = self.request_url
- request_body = self.request_body
- headers = self.headers
- session = requests.session()
- session.headers.update(headers)
- response = session.post(url, request_body)
- data = json.loads(response.content)
- re_dict ={}
- re_dict["data"] = data
- re_dict["status_code"] = response.status_code
- return re_dict
复制代码
这个是一个封装了request操作的模块。当初始化好op_request这个类以后,我们去执行send_request拿到一个返回值。
一开始我在这里做了一个判断,当请求方法是post,请求协议是http的时候,那么执行http_request_post这个函数 (基于http的post请求。)
那么以后要增加模块的时候,很简单的就会写成。
if self.method == "post" and self.protocol == "https":
re_dict = self.https_request_post()
然后在下面写一个def https_request_post(self)的方法。
如果有10种请求方法,我就会很呆萌的写10个if。
其实关于反射这个概念,我1个月以前就听说过,一直没有静下心来看,在写代码的时候虽然知道可以用反射做,不过为了快点交货,就先用这套代码应付下。
现在有时间了,就仔细看了下反射。发现,好东西很多,学不完的。
根据我自己的理解反射机制就是把你的函数名当做你的函数来调用。
- #coding=utf-8
- import requests
- import json
- class op_request(object):
- def __init__(self, request, request_body):
- self.request_url = request["host"] + request["url"]
- self.method = request["method"]
- self.protocol = request["protocol"]
- self.headers = request["headers"]
- self.request_body = request_body
- def send_request(self):
- func_name = self.protocol + "_" + self.method
- try:
- func = getattr(op_request, func_name)
- re_dict = func(self)
- except Exception,e:
- print " no func_name"
- return re_dict
- def http_post(self):
- url = self.request_url
- request_body = self.request_body
- headers = self.headers
- session = requests.session()
- session.headers.update(headers)
- response = session.post(url, request_body)
- data = json.loads(response.content)
- re_dict ={}
- re_dict["data"] = data
- re_dict["status_code"] = response.status_code
- return re_dict
复制代码
还是关注send_request()
这里我把初始化类的时候拿到协议和方法进行了一次拼接:func_name = self.protocol + "_" + self.method
然后用我拼接出来的函数名去定义一个方法,func = getattr(op_request, func_name)
然后执行这个方法:re_dict = func(self)
仔细的分解
self.protocol = http
self.method = post
那么func_name 就是 http_post
然后让程序去找http_post这个方法,如果存在就调用它。
本来要写不知道多少个的if判断,现在只要用这几行代码就搞定了了。
马上让代码有点高大上的感觉有没有。
难怪很多地方都需要开发转测试,这种对他们来说可能就是基本功。
关于getattr的用法我现在就想到这个,和他一起的还有hasattr,delattr,setattr。有新区的同学可以自己去用一下。
|
|