如何在 Python Django 中修复 /accounts/register 处的 UnboundLocalError

How To Fix UnboundLocalError at /accounts/register In Python Django

我正在尝试在我的 Django 网站中添加 recaptcha3,但我一次又一次地收到此错误,我不知道如何解决,请帮助我:

另外请告诉我为什么会出现这个错误,所以如果我再次出现这个错误我可以修复它

我遇到这个错误:

UnboundLocalError at /accounts/register
local variable 'data' referenced before assignment
Request Method: GET
Request URL:    http://127.0.0.1:8000/accounts/register
Django Version: 2.2
Exception Type: UnboundLocalError
Exception Value:    
local variable 'data' referenced before assignment
Exception Location: D:\Learning\Work\Djngo\todo_app\todo\views.py in signup, line 13
Python Executable:  C:\Users\Lenovo\AppData\Local\Programs\Python\Python37-32\python.exe
Python Version: 3.7.0

如何解决?

这是我的代码:

views.py

def signup(requests):
    secret_key = settings.RECAPTCHA_SECRET_KEY

    # captcha verification
    data = {'response': data.get('g-recaptcha-response'),'secret': secret_key,}
    resp = requests.post('https://www.google.com/recaptcha/api/siteverify', data=data)
    result_json = resp.json()

    print(result_json)

    if not result_json.get('success'):
        return render(request, 'contact_sent.html', {'is_robot': True})

    ###############################
    if requests.method == 'POST':
        reg = register(requests.POST)
        if reg.is_valid():
            user = reg.save(commit=False)
            user.set_password(User)
            user.save()
        else:
            print(reg.errors)
    else:
        reg = register()

    return render(requests,'signup.html',{'reg':reg,'site_key': settings.RECAPTCHA_SITE_KEY})

signup.html

{% extends 'base.html' %}
{% block content_block %}
<center>
    <form method="POST" class="signup mt-5">
      <div class="form-group">
        {% csrf_token %}
        {{reg.as_p}}
        <small id="emailHelp" class="form-text text-muted ">We'll never share your email with anyone else.</small>
        <input type="submit" value="Submit" style="width: 100%;" class="btn btn-dark mt-3">
      </div>
    </form>
</center>

<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>
        <script src="https://www.google.com/recaptcha/api.js?render=reCAPTCHA_site_key"></script>
        <script>
          grecaptcha.ready(function() {
              $('#contactform').submit(function(e){
                  var form = this;
                  e.preventDefault()
                  grecaptcha.execute('reCAPTCHA_site_key', {action: 'contactform'}).then(function(token) {

                      $('#recaptcha').val(token)
                      form.submit()
                  });
              })
          });
         </script>

{% endblock %}

谢谢

你的错误发生是因为你试图在它的定义之前使用变量

另外我认为你需要从 POST 对象中获取 'g-recaptcha-response',而不是从 'data' 变量中获取 'g-recaptcha-response'

尝试替换这一行:

data = {'response': data.get('g-recaptcha-response'),'secret': secret_key,}

为此:

data = {'response': request.POST.get('g-recaptcha-response'),'secret': secret_key}