开发中遇到的某个实际场景,在 django 中新增加一个 API 接口, 该接口部分的功能需要用到另一个接口的返回数据。
一个不那么优雅的解决方案是:在新接口中以 HTTP 请求的方式调用另一个接口,在理论上该方案是可行。
但是也会带来一系列的问题,比如性能并发等问题。毕竟 HTTP 通信建立连接等都有一定的耗时
更好的方案是通过函数调用的方式,在新接口中调用前接口的视图函数!我们都知道,Django 的请求数据都包装在 HttpRequest 对象中,既然我们要调用另一个接口的视图函数
那么就需要对 HttpRequest 对象进行封装,所以有必要了解一下 HttpRequest 对象
下面是我调试的图,request 对象的属性值都能一目了然
这里并不需要关注其他,我们只需要修改请求相关数据就可以GET 包含所有 GET 参数的类字典对象
POST 包含所有 POST 参数的类字典对象
headeers 请求头相关
method 请求方法
OK,了解上面所说的请求相关的数据就可以来构造我们自己请求体,然后调用前接口就可以了
这里有个小问题需要注意下 body 是 bytes 的数据类型,所以赋值的时候需要将字典类型转成 bytes,下面是该请求的原数据
接下来我将用 data 编码后数据类型重新赋值给 request.body>>> data = {"name": "jerry", "code": "Python"}
>>> import json
>>> data = json.dumps(data).encode(encoding="utf-8")
>>> data
b'"{\\"name\\": \\"jerry\\", \\"code\\": \\"Python\\"}"'
>>> request.body = data
在输完最后一行赋值代码后,报错了
提示不能重置,原来是 body 属性是不可修改的。好在 django 还有另一个参数 _body, 而且 body 属性继承自 _body 属性, 所以直接修改 _body 属性就好了>>> request._body = data
>>> data
b'"{\\"name\\": \\"jerry\\", \\"code\\": \\"Python\\"}"
赋值之后我们再来查看下 body 的值
可以看到,已经修改成我们想要的数据了。接下来将这个 request 对象传给之前的接口就完事了!推荐阅读
THANKS
- End -
点个“在看”必升职加薪喔