#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. Хорошо, спасибо, я понимаю