локальная переменная ‘verify_payment’, на которую ссылаются перед назначением

#python #django

#питон #джанго

Вопрос:

У меня есть ссылка на локальную переменную перед ошибкой назначения, и я перепробовал множество способов, которые я могу использовать, чтобы исправить это. Любая помощь будет очень признательна

Это мое Views.py (ошибка после верхней части второго оператора if)

 def call_back_url(request):  reference = request.GET.get('reference')  # We need to fetch the reference from PAYMENT  check_pay = PayHistory.objects.filter(paystack_charge_id=reference).exists()  if check_pay == False:  # This means payment was not made error should be thrown here...  print("Error")  else:  payment = PayHistory.objects.get(paystack_charge_id=reference)  # We need to fetch this to verify if the payment was successful.  def verify_payment(request):  url = 'https://api.paystack.co/transaction/verify/' reference  headers = {  'Authorization': 'Bearer ' settings.PAYSTACK_SECRET_KEY,  'Content-Type' : 'application/json',  'Accept': 'application/json',  }  datum = {  "reference": payment.paystack_charge_id  }  x = requests.get(url, data=json.dumps(datum), headers=headers)  if x.status_code != 200:  return str(x.status_code)    results = x.json()  return results  initialized = verify_payment(request)  if initialized['data']['status'] == 'success':  PayHistory.objects.filter(paystack_charge_id=initialized['data']['reference']).update(paid=True)  new_payment = PayHistory.objects.get(paystack_charge_id=initialized['data']['reference'])  instance = Membership.objects.get(id=new_payment.payment_for.id)  sub = UserMembership.objects.filter(reference_code=initialized['data']['reference']).update(membership=instance)  user_membership = UserMembership.objects.get(reference_code=initialized['data']['reference'])  Subscription.objects.create(user_membership=user_membership, expires_in=dt.now().date()   timedelta(days=user_membership.membership.duration))  return redirect('subscribed')  return render(request, 'payment.html')   def subscribed(request):  return render(request, 'subscribed.html')  

Обратная связь, которую я получаю:

 System check identified 1 issue (0 silenced). November 26, 2021 - 18:50:42 Django version 3.2.9, using settings 'dexxapikprj.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. Error Internal Server Error: /sub/payment/ Traceback (most recent call last):  File "C:UsersDestinyDesktopDexxaPikvenvlibsite-packagesdjangocorehandlersexception.py", line 47, in inner  response = get_response(request)  File "C:UsersDestinyDesktopDexxaPikvenvlibsite-packagesdjangocorehandlersbase.py", line 181, in _get_response  response = wrapped_callback(request, *callback_args, **callback_kwargs)  File "C:UsersDestinyDesktopDexxaPikdexxapikprjsubscriptionviews.py", line 85, in call_back_url  initialized = verify_payment(request) UnboundLocalError: local variable 'verify_payment' referenced before assignment [26/Nov/2021 18:50:44] "GET /sub/payment/ HTTP/1.1" 500 66028  

Комментарии:

1. Ваша функция определена в else , поэтому не может быть определена вообще. Не рекомендуется определять функции таким образом

2. @гонсало-одиард, пожалуйста, что мне делать?? я новичок

Ответ №1:

пробовать:

 def verify_payment(request):  url = 'https://api.paystack.co/transaction/verify/' reference  headers = {  'Authorization': 'Bearer ' settings.PAYSTACK_SECRET_KEY,  'Content-Type' : 'application/json',  'Accept': 'application/json',  }  datum = {  "reference": payment.paystack_charge_id  }  x = requests.get(url, data=json.dumps(datum), headers=headers)  if x.status_code != 200:  return str(x.status_code)    results = x.json()  return results  def call_back_url(request):  reference = request.GET.get('reference')  # We need to fetch the reference from PAYMENT  check_pay = PayHistory.objects.filter(paystack_charge_id=reference).exists()  if check_pay == False:  # This means payment was not made error should be thrown here...  print("Error")  else:  payment = PayHistory.objects.get(paystack_charge_id=reference)  # We need to fetch this to verify if the payment was successful.   initialized = verify_payment(request)  if initialized['data']['status'] == 'success':  PayHistory.objects.filter(paystack_charge_id=initialized['data']['reference']).update(paid=True)  new_payment = PayHistory.objects.get(paystack_charge_id=initialized['data']['reference'])  instance = Membership.objects.get(id=new_payment.payment_for.id)  sub = UserMembership.objects.filter(reference_code=initialized['data']['reference']).update(membership=instance)  user_membership = UserMembership.objects.get(reference_code=initialized['data']['reference'])  Subscription.objects.create(user_membership=user_membership, expires_in=dt.now().date()   timedelta(days=user_membership.membership.duration))  return redirect('subscribed')  return render(request, 'payment.html')  def subscribed(request):  return render(request, 'subscribed.html')   

Комментарии:

1. @DestinyFranks Чтобы объяснить, вы объявляли свою verify_payment функцию в else инструкции, поэтому, если check_pay значение было ложным, verify_payment функция не существует, поэтому вы получаете ссылку на локальную переменную перед ошибкой назначения.

2. Хорошо, спасибо, я понимаю