python - 我的装饰器中需要该请求,但我不知道如何将其放入其中

标签 python django

我的除雾器功能...

def validate_captcha(view):
    '''Decorator to validate a captcha based on settings'''

    def failure():
        return HttpResponse('You need to complete the captcha, please refresh and try again')

    if request.method == 'POST':

        url = "https://www.google.com/recaptcha/api/siteverify"
        values = {
            'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
            'response': request.POST.get(u'g-recaptcha-response', None),
            'remoteip': request.META.get("REMOTE_ADDR", None),
        }

        data = urllib.urlencode(values)
        req = urllib2.Request(url, data)
        response = urllib2.urlopen(req)
        result = json.loads(response.read())

        # result["success"] will be True on a success
        if result["success"]:
            return view
        else:
            return fail
    return fail

然后是我的观点...

@validate_captcha
def sendemail(request):
    ...

我可以将请求放入装饰器参数中,但是当我将其放入 View 参数中时,它是未定义的。我尝试用其他几种方式调用它,但没有成功,你会如何把它放在那里?

最佳答案

您需要有一个包装函数:

def validate_captcha(view):
    def wrap(request, *args, **kwargs):
        if request.method == 'POST':

            url = "https://www.google.com/recaptcha/api/siteverify"
            values = {
                'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
                'response': request.POST.get(u'g-recaptcha-response', None),
                'remoteip': request.META.get("REMOTE_ADDR", None),
            }

            data = urllib.urlencode(values)
            req = urllib2.Request(url, data)
            response = urllib2.urlopen(req)
            result = json.loads(response.read())

            # result["success"] will be True on a success
            if result["success"]:
                return view
            else:
                return fail
        return fail
    return wrap

一定要研究一下关于 Python 中装饰器的这个很棒且非常详细的概述(我个人认为,这是有史以来最好的答案之一):

关于python - 我的装饰器中需要该请求,但我不知道如何将其放入其中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35076852/

相关文章:

python - 加载共享库 : libssl. so.0.9.8 时出现 django runserver 错误:无法打开共享对象文件:没有这样的文件或目录

python - 在 Python 中解释数字范围

python - 如何使用 python 执行此命令并返回结果?

django - 使用 Django 和 Python 3 检测移动设备

python - 如何在Django中自动为注册到平台的新用户创建用户配置文件

django - 在具有ManyToMany字段的QuerySet上输出values()

django - 为什么 Django 不使用我的 Registration/reset_password_done.html 模板?

python - 将 numpy 数组作为文件存储和加载

python - 添加日期匹配的列表元素 (Python)

python - 为什么模型的准确率高达 84%,但 AUC 却非常低(13%)?