django 内 A 接口将 request 转发到 B 接口, 获取返回, 再继续 A 接口的逻辑,都有哪些方法?

2019-05-17 15:56:42 +08:00
 firejoke

场景:
有一个接口, 接受请求返回一个状态信息
另一个接口, 有一小段逻辑需要跟据状态信息做相应的处理
不想重复写查询代码, 想着直接从 A 接口获取接口
目前我试过的只有这一个 A.py

from django.views.generic import View
from django.http import JsonResponse, HttpResponseRedirect


class A(View):

    def get(self, request, *args, **kwargs):
        return HttpResponseRedirect('/')

	def post(self, request, *args, **kwargs):
        result_dict = {'res': 'Test'}
        return JsonResponse(result_dict)

B.py

import json

from django.views.generic import View
from django.http import JsonResponse, HttpResponseRedirect

from .A import A


class B(View):

    def get(self, request, *args, **kwargs):
        return HttpResponseRedirect('/')

    def post(self, request, *args, **kwargs):
        view = A.as_view()
        res = view(request)
        res = res.getvalue()
        res = json.loads(res)['res']
        result_dict = {'res': self._logic(res)}
        return JsonResponse(result_dict)

    def _logic():
        if res == 1:
            ......
            return 1
        elif == 2:
            ......
            return 2
        else:
            return 0

总感觉以前在哪看到过更规范的, 但忘了......

3976 次点击
所在节点    Django
14 条回复
so1n
2019-05-17 16:07:15 +08:00
不可以函数调用吗
40huo
2019-05-17 16:25:15 +08:00
非要用接口的话可以用 Django 带的 testclient
firejoke
2019-05-17 17:19:15 +08:00
@so1n A 接口需要从 request 中获取是否已经登陆, 然后还要获取其他信息, 所以必须把 rrequest 传过去, 并且 request 还要修改一下携带的参数
firejoke
2019-05-17 17:40:58 +08:00
@40huo 但是接口会检测登陆信息, 可以看我更新的附言
noobsheldon
2019-05-17 18:10:38 +08:00
把 A 接口写成 middleware ?
firejoke
2019-05-17 18:24:05 +08:00
@noobsheldon 是个思路, 给定一个路由范围, 凡是访问该范围内的路由, 都先走一遍 A 的逻辑, 然后将结果加在 request 里?
可以, 也是一个 hack 方法~
lusi1990
2019-05-17 18:24:28 +08:00
面向切片? before request ? 继承? 我瞎猜的
firejoke
2019-05-17 18:31:33 +08:00
@noobsheldon 不过这样的话, 我完全可以把 A 的逻辑单独摘出来放到 util 工具模块里去,
我现在就想知道还有没有其他的可以在 B 接口访问 A 接口的方法, 万一以后还有其他这类场景, 而 A 的逻辑又太多不好摘出来, 就需要用到这类方法了
firejoke
2019-05-17 18:34:02 +08:00
@lusi1990 继承没必要, 并不需要 A 的所有方法, 装饰器就和上面那位要写成 middleware 的思路差不多
noobsheldon
2019-05-17 18:48:37 +08:00
@firejoke 分接口的目的不就是为了分开吗…如果有公用部分直接做成 utils (如你所言)
firejoke
2019-05-17 19:24:41 +08:00
@noobsheldon 对了, 可以用 django 的 signal 信号机制, B 接口做完一部分逻辑, 发送一个信号, A 接口接收信号, 做处理, 再发送一个信号, B 接口再接收信号
应用场景应该是 B 接口对 C 资源做出了改变, 而 A 接口需要根据 C 资源的状态更改 D 资源, 防止其他接口访问 D 资源的时候出现幻读之类的
比如回帖, 更新帖子内容, 通知楼主, 可以把每一个逻辑单独做出来, 防止多个接口对同一个资源多次访问
freakxx
2019-05-18 10:40:32 +08:00
感觉有些乱来

view 的作用是处理 request response, 没必要这么引用

如果 A 和 B 有代码可以共用,那么就抽出来做个 Mxin 就可以,没必要交叉

随便改了下,类似这样
https://gist.github.com/chrisguox/4de1a0cc586055d776be818ed636cf6e
freakxx
2019-05-18 10:45:04 +08:00
如果更复杂的情况,

如果是基本业务代码相同,可以考虑做成 parent view 然后继承;
如果是业务代码共用,需要做部分处理,那么在类内做成 base func,用*kwarg 来做处理,

代码相对来说可能比较漂亮些;

另外作为 drf 吹( django rest framework ),推荐你使用。
firejoke
2019-05-20 11:12:54 +08:00
@freakxx
我也喜欢 rest 风格, 有考虑后面整个用 restframework 做(反正这小项目后端完全我一个人做主~)

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

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

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

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

© 2021 V2EX