12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- from urllib.parse import urlencode
- from flask import current_app
- from markupsafe import Markup
- RECAPTCHA_SCRIPT_DEFAULT = "https://www.google.com/recaptcha/api.js"
- RECAPTCHA_DIV_CLASS_DEFAULT = "g-recaptcha"
- RECAPTCHA_TEMPLATE = """
- <script src='%s' async defer></script>
- <div class="%s" %s></div>
- """
- __all__ = ["RecaptchaWidget"]
- class RecaptchaWidget:
- def recaptcha_html(self, public_key):
- html = current_app.config.get("RECAPTCHA_HTML")
- if html:
- return Markup(html)
- params = current_app.config.get("RECAPTCHA_PARAMETERS")
- script = current_app.config.get("RECAPTCHA_SCRIPT")
- if not script:
- script = RECAPTCHA_SCRIPT_DEFAULT
- if params:
- script += "?" + urlencode(params)
- attrs = current_app.config.get("RECAPTCHA_DATA_ATTRS", {})
- attrs["sitekey"] = public_key
- snippet = " ".join(f'data-{k}="{attrs[k]}"' for k in attrs) # noqa: B028, B907
- div_class = current_app.config.get("RECAPTCHA_DIV_CLASS")
- if not div_class:
- div_class = RECAPTCHA_DIV_CLASS_DEFAULT
- return Markup(RECAPTCHA_TEMPLATE % (script, div_class, snippet))
- def __call__(self, field, error=None, **kwargs):
- """Returns the recaptcha input HTML."""
- try:
- public_key = current_app.config["RECAPTCHA_PUBLIC_KEY"]
- except KeyError:
- raise RuntimeError("RECAPTCHA_PUBLIC_KEY config not set") from None
- return self.recaptcha_html(public_key)
|