docs: def is_spam_akismet(request, form, url):
      """
      Identifies form data as being spam, using the http://akismet.com
      service. The Akismet API key should be specified in the
      ``AKISMET_API_KEY`` setting. This function is the default spam
      handler defined in the ``SPAM_FILTERS`` setting.
  
      The name, email, url and comment fields are all guessed from the
      form fields:
  
      * name: First field labelled "Name", also taking i18n into account.
      * email: First ``EmailField`` field.
      * url: First ``URLField`` field.
      * comment: First field with a ``Textarea`` widget.
  
      If the actual comment can't be extracted, spam checking is passed.
  
      The referrer field expects a hidden form field to pass the referrer
      through, since the HTTP_REFERER will be the URL the form is posted
      from. The hidden referrer field is made available by default with
      the ``{% fields_for %}`` templatetag used for rendering form fields.
      """
      if not settings.AKISMET_API_KEY:
          return False
      protocol = "http" if not request.is_secure() else "https"
      host = protocol + "://" + request.get_host()
      data = {
          "blog": host,
          "user_ip": ip_for_request(request),
          "user_agent": request.META.get("HTTP_USER_AGENT", ""),
          "referrer": request.POST.get("referrer", ""),
          "permalink": host + url,
          "comment_type": "comment" if "comment" in request.POST else "form",
      }
      for name, field in form.fields.items():
          data_field = None
          if field.label and field.label.lower() in ("name", _("Name").lower()):
              data_field = "comment_author"
          elif isinstance(field, EmailField):
              data_field = "comment_author_email"
          elif isinstance(field, URLField):
              data_field = "comment_author_url"
          elif isinstance(field.widget, Textarea):
              data_field = "comment_content"
          if data_field and not data.get(data_field):
              cleaned_data = form.cleaned_data.get(name)
              try:
                  data[data_field] = cleaned_data.encode('utf-8')
              except UnicodeEncodeError:
                  data[data_field] = cleaned_data
      if not data.get("comment_content"):
          return False
      api_url = ("http://%s.rest.akismet.com/1.1/comment-check" %
                 settings.AKISMET_API_KEY)
      versions = (django.get_version(), yacms.__version__)
      headers = {"User-Agent": "Django/%s | Yacms/%s" % versions}
      try:
          response = urlopen(Request(api_url, urlencode(data).encode('utf-8'),
                                     headers)).read()
      except Exception:
          return False
  
      # Python 3 returns response as a bytestring, Python 2 as a regular str
      return response in (b'true', 'true')