django make_view处理可变参数
LJxFFFF opened this issue · comments
-
对 Bug 的描述
- 当前行为:make_view产生的request对象只接收一个request参数
- 正确的行为:make_view产生的request对象支持接收可变参数
-
环境
- 平台:linux
- WeRoBot 版本号:1.13.1
- Python 版本:3.9
-
复现代码或 repo 链接
WeRoBot/werobot/contrib/django.py
Line 17 in 927083a
from django.conf.urls import url
from werobot import WeRoBot
robot = WeRoBot(token=Token,
enable_session=True,
session_storage=session_storage,
logger=logger)
urlpatterns = [url(r'^api/(v1|v2|v3)/robot/', make_view(robot.robot)]
# 请在这里给出 bug 的复现代码。如有必要,可以创建一个复现 repo 并将链接粘贴到这里。
-
复现步骤
向公众号发送消息
微信请求被转发到/api/v1/robot/接口 -
其他信息
出现原因:
Django 2.x 以上版本中,如果api带有正则,会将正则匹配出的值传给请求处理函数。(https://docs.djangoproject.com/en/3.1/topics/http/urls/#how-django-processes-a-request)
在示例的 urlpattern中, 函数werobot_view接收到的参数有两个,分别是是request对象和正则表达式(v1|v2|v3)匹配出的值。
修改werobot_view参数为 (request, *args, **kwargs) 应该可以兼容这个corner case。
错误日志如下
Traceback (most recent call last): File "/opt/venvs/api/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/opt/venvs/api/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) TypeError: werobot_view() takes 1 positional argument but 2 were given