使用 django-simple-captcha 的方法
- 2019 年 10 月 10 日
- 筆記
Installation
- Install
django-simple-captcha
via pip:pip install django-simple-captcha
- Add
captcha
to theINSTALLED_APPS
in yoursettings.py
- Run
python manage.py migrate
- Add an entry to your
urls.py
:
urlpatterns += [ url(r'^captcha/', include('captcha.urls')), ]
Note: PIL and Pillow require that image libraries are installed on your system. On e.g. Debian or Ubuntu, you’d need these packages to compile and install Pillow:
apt-get -y install libz-dev libjpeg-dev libfreetype6-dev python-dev
Adding to a Form
Using a CaptchaField
is quite straight-forward:
Define the Form
To embed a CAPTCHA in your forms, simply add a CaptchaField
to the form definition:
from django import forms from captcha.fields import CaptchaField class CaptchaTestForm(forms.Form): myfield = AnyOtherField() captcha = CaptchaField()
…or, as a ModelForm
:
from django import forms from captcha.fields import CaptchaField class CaptchaTestModelForm(forms.ModelForm): captcha = CaptchaField() class Meta: model = MyModel
Validate the Form
In your view, validate the form as usual. If the user didn’t provide a valid response to the CAPTCHA challenge, the form will raise a ValidationError
:
def some_view(request): if request.POST: form = CaptchaTestForm(request.POST) # Validate the form: the captcha field will automatically # check the input if form.is_valid(): human = True else: form = CaptchaTestForm() return render_to_response('template.html',locals())
Passing arguments to the field
CaptchaField
takes a few optional arguements:
-
output_format
will let you format the layout of the rendered field. Defaults to the value defined in : CAPTCHA_OUTPUT_FORMAT. -
id_prefix
Optional prefix that will be added to the ID attribute in the generated fields and labels, to be used when e.g. several Captcha fields are being displayed on a same page. (added in version 0.4.4) -
generator
Optional callable or module path to callable that will be used to generate the challenge and the response, e.g.generator='path.to.generator_function'
orgenerator=lambda: ('LOL', 'LOL')
, see also Generators and modifiers. Defaults to whatever is defined insettings.CAPTCHA_CHALLENGE_FUNCT
.
Example usage for ajax form
An example CAPTCHA validation in AJAX:
from django.views.generic.edit import CreateView from captcha.models import CaptchaStore from captcha.helpers import captcha_image_url from django.http import HttpResponse import json class AjaxExampleForm(CreateView): template_name = '' form_class = AjaxForm def form_invalid(self, form): if self.request.is_ajax(): to_json_response = dict() to_json_response['status'] = 0 to_json_response['form_errors'] = form.errors to_json_response['new_cptch_key'] = CaptchaStore.generate_key() to_json_response['new_cptch_image'] = captcha_image_url(to_json_response['new_cptch_key']) return HttpResponse(json.dumps(to_json_response), content_type='application/json') def form_valid(self, form): form.save() if self.request.is_ajax(): to_json_response = dict() to_json_response['status'] = 1 to_json_response['new_cptch_key'] = CaptchaStore.generate_key() to_json_response['new_cptch_image'] = captcha_image_url(to_json_response['new_cptch_key']) return HttpResponse(json.dumps(to_json_response), content_type='application/json')
And in javascript your must update the image and hidden input in form
Example usage ajax refresh button
html:
<form action='.' method='POST'> {{ form }} <input type="submit" /> <button class='js-captcha-refresh'></button> </form>
javascript:
$('.js-captcha-refresh').click(function(){ $form = $(this).parents('form'); $.getJSON($(this).data('url'), {}, function(json) { // This should update your captcha image src and captcha hidden input }); return false; });
Example usage ajax refresh
javascript:
$('.captcha').click(function () { $.getJSON("/captcha/refresh/", function (result) { $('.captcha').attr('src', result['image_url']); $('#id_captcha_0').val(result['key']) }); });