【问题标题】:Django process_response() takes 2 positional arguments but 3 were givenDjango process_response() 接受 2 个位置参数,但给出了 3 个
【发布时间】:2015-04-18 13:40:06
【问题描述】:

我正在尝试为我的 django 应用程序编写一些中间件。在docs 中,它使用两个参数定义流程响应,请求和响应。但是当我尝试编写一些中间件时,会抛出异常:

Type Error:
process_response() takes 2 positional arguments but 3 were given

这是我的代码:

从 django.http 导入 HttpResponseRedirect

class Middleware(object):

    def process_response(self, request, response):
        print('processing response')
        ref = request.GET.get('ref','')
        if ref:
            response.set_cookie('ref', ref, max_age=3600*24*365)
        return response

    def process_request(request):
        print('processing request')
        print(request.META['PATH_INFO'])
        ref = request.COOKIES.get('ref','')
        if ref:
            request.GET['ref'] = ref
        return None

但是后来发生了一件奇怪的事情。我注释掉了 process_request 函数。然后我得到0个错误。当我取消注释 process_request 函数时,我得到了错误:

process_request() takes 1 positional argument but 2 were given

这开始看起来像是随机行为..

【问题讨论】:

    标签: django django-middleware


    【解决方案1】:

    process_request 定义中缺少 self

    【讨论】:

    • 啊,是的,文档没有说明任何关于定义“自我”的内容。但无论如何我都在玩这个。但为什么文档不会提到“自我”?只是暗示了“自我”吗?
    • 这就是类实例上的普通方法的工作方式——它们总是接收它们被调用的实例作为它们的第一个参数。 docs.python.org/2/tutorial/classes.html#method-objects了解详情。
    【解决方案2】:

    我在出现错误消息“接受 2 个位置参数,但给出了 3 个”之后来到这里,尽管在我的情况下,我实际上提供了 2 个位置参数并且需要 3 个。这适用于处于相同情况的任何其他人。 Django 2.2.5 适合我。

    改变

    def has_add_permission(self, request):
        return False
    

    到:

    def has_add_permission(self, request, obj=None):
        return False
    

    我可能可以通过查看 django 源代码找到它,但我在这里找到了它:

    https://github.com/celiao/django-rest-authemail/issues/32#issuecomment-800859698

    【讨论】:

    • 嗨,马丁,很抱歉有多个帖子,我很感激下次如何执行此操作的指导。很难找到这个问题的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2022-01-17
    • 2019-09-21
    • 2019-07-19
    • 2021-02-02
    • 2020-02-07
    • 2017-03-14
    相关资源
    最近更新 更多