I am new to Django, I got this ‘AnonymousUser’ error.
Request Method: | POST |
---|---|
Request URL: | https://myapp.in/payments/callback/ |
Django Version: | 4.2.3 |
Exception Type: | AttributeError |
Exception Value: | ‘AnonymousUser’ object has no attribute ‘type’ |
Exception Location: | /home/okuser/virtualenv/una_app/3.9/lib/python3.9/site-packages/django/utils/functional.py, line 268, in inner |
Raised during: | payments.views.callback |
Python Executable: | /home/ okuser /virtualenv/una_app/3.9/bin/python |
Python Version: | 3.9.16 |
Python Path: | [‘’, ‘/home/okuser/una_app’, |
‘/opt/alt/python39/lib64/python39.zip’, ‘/opt/alt/python39/lib64/python3.9’, ‘/opt/alt/python39/lib64/python3.9/lib-dynload’, ‘/home/okuser/virtualenv/una_app/3.9/lib64/python3.9/site-packages’,
‘/home/okuser/virtualenv/una_app/3.9/lib/python3.9/site-packages’]|
|Server time:|Thu, 24 Aug 2023 08:09:19 +0530|
my accounts/views.py
def SignUpView(request, slug):
# logout(request)
member_type = MembershipType.objects.get(slug=slug)
user_type = member_type.slug
price = member_type.price
# Student function
if slug == 'student':
if request.method == 'POST':
student_user_form = StudentForm(request.POST)
student_add_form = StudentAddForm(request.POST, request.FILES)
if student_user_form.is_valid() and student_add_form.is_valid():
user_obj = student_user_form.save(commit=False)
user_obj.set_password(user_obj.password)
user_obj.is_student = True
user_obj.type = slug
user_obj.save()
student = student_add_form.save(commit=False)
student.user = user_obj
student.save()
login(request,user_obj)
return redirect('payment-page', slug=slug)
else:
print(student_user_form.errors)
print(student_add_form.errors)
else:
student_user_form = StudentForm()
student_add_form = StudentAddForm()
context = {
'user_form':student_user_form,
'add_form':student_add_form,
'user_type':user_type,
'student':'student',
'price':price,
'slug': slug,
}
return render(request, 'registration/student_form.html', context)
elif slug == 'other':
if request.method == 'POST':
other_user_form = OtherForm(request.POST)
other_add_form = OtherAddForm(request.POST, request.FILES)
if other_user_form.is_valid() and other_add_form.is_valid():
user_obj = other_user_form.save(commit=False)
user_obj.set_password(user_obj.password)
user_obj.is_others = True
user_obj.type = slug
user_obj.save()
other = other_add_form.save(commit=False)
other.user = user_obj
other.save()
login(request,user_obj)
return redirect('payment-page', slug=slug)
else:
print(other_user_form.errors)
print(other_add_form.errors)
else:
other_user_form = OtherForm()
other_add_form = OtherAddForm()
context = {
'user_form':other_user_form,
'add_form':other_add_form,
'user_type':user_type,
'price':price ,
'slug':slug ,
'other':'other',
}
return render(request, 'registration/nurse_form.html', context)
elif slug == 'faculty':
if request.method == 'POST':
faculty_user_form = FacultyForm(request.POST)
faculty_add_form = FacultyAddForm(request.POST, request.FILES)
if faculty_user_form.is_valid() and faculty_add_form.is_valid():
user_obj = faculty_user_form.save(commit=False)
user_obj.set_password(user_obj.password)
user_obj.is_faculty = True
user_obj.type = slug
user_obj.save()
faculty = faculty_add_form.save(commit=False)
faculty.user = user_obj
faculty.save()
login(request,user_obj)
return redirect('payment-page', slug=slug)
else:
pass
else:
faculty_user_form = FacultyForm()
faculty_add_form = FacultyAddForm()
context = {
'user_form':faculty_user_form,
'add_form':faculty_add_form,
'user_type':user_type,
'price':price,
'slug':slug,
}
return render(request, 'registration/nurse_form.html', context)
else:
if request.method == 'POST':
nurse_user_form = NurseForm(request.POST)
nurse_add_form = NurseAddForm(request.POST, request.FILES)
if nurse_user_form.is_valid() and nurse_add_form.is_valid():
user_obj = nurse_user_form.save(commit=False)
user_obj.set_password(user_obj.password)
user_obj.is_nurse = True
user_obj.type = slug
user_obj.save()
nurse = nurse_add_form.save(commit=False)
nurse.user = user_obj
nurse.save()
login(request,user_obj)
return redirect('payment-page', slug=slug)
else:
print(nurse_user_form.errors)
print(nurse_add_form.errors)
else:
nurse_user_form = NurseForm()
nurse_add_form = NurseAddForm()
context = {
"user_type": user_type,
"price": price,
"user_form": nurse_user_form,
"add_form": nurse_add_form
}
return render(request, 'registration/nurse_form.html', context)
My payments/views.py
from django.shortcuts import redirect, render
from django.conf import settings
from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt
from accounts.models import MembershipType
from .models import Payment
from django.contrib.auth import get_user_model
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.db import transaction
from django.template.loader import get_template
from django.core.mail import EmailMultiAlternatives
import json
import razorpay
from accounts.models import Nurse,Student,Faculty,Other
User = get_user_model()
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),
'slug':slug,
}
# return render(request, 'payment_failure.html', context)
return render(request, 'something_wrong.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)
profile.mail_sent = True
profile.save()
except Exception as e:
print(e)
profile_url = reverse('profile', kwargs={'user_id': user.id})
messages.success(request, "Welcome to Community!")
return redirect(profile_url)
else:
payment.status = False
payment.save()
error_message = "Payment verification failed. Please try again."
user = request.user
#
context = {
'error_message' : error_message,
'type':user.type,
}
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,
'type':user.type,
}
return render(request, 'something_wrong.html', context)
except Payment.DoesNotExist:
error_message = 'failed'
# return redirect('error_view', error_message=error_message)
user = request.user
context = {
'error_message' : error_message,
'type':user.type,
}
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)
user = request.user
context = {
'error_message' : error_message,
'type':user.type,
}
return render(request, 'something_wrong.html', context)
def error_view(request):
# context = {'error_message': error_message}
return render(request, "something_wrong.html" )
def failed_view(request):
# context = {'error_message': error_message}
return render(request, "payment_failure.html" )
please help me to fix this, thanks