Help me to optimize My code and error handling


razorpay_client = razorpay.Client(auth=(settings.RAZOR_KEY_ID, settings.RAZOR_KEY_SECRET))



def selectMemberType(slug,user):
    if slug == 'nurse':
        return Nurse.objects.get(user=user)
    elif slug == 'student':
        return Student.objects.get(user=user)
    elif slug == 'faculty':
        return Faculty.objects.get(user=user)
    elif slug == 'other':
        return Other.objects.get(user=user)
    


@login_required
def payment_page(request, slug):
    try:
        member_type = get_object_or_404(MembershipType, slug=slug)
        amount = member_type.price
        currency = 'INR'
        product_name = str(slug).capitalize()

        if request.user.is_anonymous:
            messages.error(request, "Welcome to UNA Community!")
            return redirect('login')

        user_obj = request.user 
        razorpay_order = razorpay_client.order.create(dict(
            amount=amount * 100,
            currency=currency,
            payment_capture='0'
        ))

        razorpay_order_id = razorpay_order['id']
        profile_obj = selectMemberType(slug, request.user) 
        full_path = settings.SITE_URL + '/payments/payment-handler/'
        context = {
            'razorpay_order_id': razorpay_order_id,
            'razorpay_merchant_key': settings.RAZOR_KEY_ID,
            'razorpay_name': product_name,
            'razorpay_amount': amount * 100,
            'currency': currency,
            'email': user_obj.email,
            'phone': profile_obj.mobile,
            'url_path': full_path,
            "callback_url": settings.SITE_URL + "/payments/callback/",
        }

        payment = Payment.objects.create(
            payment_order_id=razorpay_order_id,
            amount=amount,
            user=user_obj,
            name=product_name,
        )
        payment.save()

        return render(request, 'payment-page.html', context)

    except Exception as e:
        # Handle exceptions here, log them, and return an appropriate response.
        # You can customize this based on the specific exceptions you expect.
    
        context = {
            'error_message' : str(e),
        }

        return render(request, 'payment_failure.html', context)





@csrf_exempt
def callback(request):

    def verify_signature(response_data):
        client = razorpay.Client(auth=(settings.RAZOR_KEY_ID, settings.RAZOR_KEY_SECRET))
        return client.utility.verify_payment_signature(response_data)

    try:
        if "razorpay_signature" in request.POST:
            payment_id = request.POST.get("razorpay_payment_id", "")
            provider_order_id = request.POST.get("razorpay_order_id", "")
            signature_id = request.POST.get("razorpay_signature", "")

            payment = Payment.objects.get(payment_order_id=provider_order_id)
            payment.payment_id = payment_id
            payment.signature_id = signature_id
            payment.save()

            if verify_signature(request.POST):
                payment.status = True
                payment.save()
                user = request.user
                user.is_paid = True
                profile = selectMemberType(user.type, user)
                profile.is_paid = True
                user.save()
                profile.save()

                try:
                    # email section
                    def send_email():
                        html_template = get_template('email_temp.html')
                        context = {'profile': profile, 'user': user}
                        subject, from_email, to = 'UNA Membership Confirmation', settings.EMAIL_HOST_USER, user.email
                        html_content = html_template.render(context)
                        text_content = F"You are successfully registered as {user.type}"
                        msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
                        msg.attach_alternative(html_content, "text/html")
                        msg.send()
                    transaction.on_commit(send_email)

                    user.mail_sent = True
                    user.save()

                except Exception as e:
                    print(e)


                profile_url = reverse('profile', kwargs={'user_id': user.id})
                messages.success(request, "Welcome to UNA Community!")
                return redirect(profile_url)
                
            else:
                payment.status = False
                payment.save()
                error_message = "Payment verification failed. Please try again."

                context = {
                    'error_message' : error_message
                }
                return render(request, 'something_wrong.html', context)
            

        else:
            # Handle error case where 'razorpay_signature' is not in request.POST
            error_metadata = json.loads(request.POST.get("error[metadata]"))
            payment_id = error_metadata.get("payment_id")
            provider_order_id = error_metadata.get("order_id")
            payment = Payment.objects.get(payment_order_id=provider_order_id)
            payment.payment_id = payment_id
            payment.status = False
            payment.save()

            # Additional error handling logic here

            error_metadata_str = json.dumps(error_metadata) 
            # return redirect('error_view', error_message=error_metadata_str)
            context = {
                'error_message' : error_metadata_str
                }
            return render(request, 'something_wrong.html', context) 
            

    except Payment.DoesNotExist:
        error_message = 'failed'
        # return redirect('error_view', error_message=error_message)
        context = {
                'error_message' : error_message
                }
        return render(request, 'something_wrong.html', context)
    
    
    except Exception as e:
        error_message = str(e)
        # messages.error(request, f"An error occurred: {str(e)}")
        # return redirect('error_view', error_message=error_message)
        context = {
                'error_message' : error_message
                }
        
        return render(request, 'something_wrong.html', context)  

What is wrong or not working that you believe should be “optimized” or improved?