我的除雾器功能...
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/