offu / WeRoBot

WeRoBot 是一个微信公众号开发框架

Home Page:https://werobot.readthedocs.io/zh_CN/latest/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

django make_view处理可变参数

LJxFFFF opened this issue · comments

commented
  • 对 Bug 的描述

    • 当前行为:make_view产生的request对象只接收一个request参数
    • 正确的行为:make_view产生的request对象支持接收可变参数
  • 环境

    • 平台:linux
    • WeRoBot 版本号:1.13.1
    • Python 版本:3.9
  • 复现代码或 repo 链接

    def werobot_view(request):

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