Как выполнить представление Django через сигнал Stripe?
После того, как клиент разблокировал пост, я хочу добавить его профиль в список профилей, которые разблокировали этот пост.
def unlockpostview(request, post_id):
if userthatisunlockingprofile in post.unlockedby.all():
pass
else:
post.unlockedby.add(userthatisunlockingprofile)
Когда пользователь заплатил, я слушаю событие Stripe succeeded
и выполняю представление следующим образом:
if (result.paymentIntent.status === 'succeeded') {
$.get("{% url 'postsapp:unlockpostview' post.post_id %}")
window.alert("Unlocked")
}
Моя проблема заключалась в том, что любой мог зайти в пост и просто добавить /unlock
в конец URL и выполнить представление.
Затем я добавил
if request.is_ajax():
к виду, но это все еще не оптимальное решение. Я не ожидаю полного решения этой проблемы, но, пожалуйста, укажите мне правильное направление, если сможете. Спасибо :)
в POST запросе вы не передаете переменные в URL, а также CSRF токен в подарок. А пользователи дампа не могут легко отправлять POST запросы в браузере
if (result.paymentIntent.status === 'succeeded') {
$.ajax({
type: "POST",
url: "{% url 'postsapp:unlockpostview' %}",
headers: {
'X-CSRFToken': '{{ csrf_token }}'
},
data: {
'operation': 'unlock_action',
'post_id': {{ post.post_id }}, //IDK how do you take it
'user': {{ request.user.id }}
},
dataType: "json",
success: function(response) {
if(response.success == true){
window.alert("Unlocked")
}
},
error: function(rs, e) {
console.log('error')
}
});
}
Просто удалите атрибут post_id из вашего url или:
urls.py
urlpatterns = [
path('unlockpostview/', views.unlockpostview, name="unlockpostview"),
]
views.py:
def unlockpostview(request):
if request.user.is_authenticated:
if request.method == 'POST' and request.POST.get("operation") == "unlock_action":
post = Post.objects.get(id=request.POST.get("post_id"))
userthatisunlockingprofile = User.objects.get(id=request.POST.get("user"))
#then your logic
if userthatisunlockingprofile in post.unlockedby.all():
ctx={"succes":True,"status":"exist"}
else:
post.unlockedby.add(userthatisunlockingprofile)
ctx={"succes":True,"status":"created"}
return JsonResponse(ctx)
else:
return redirect("home")
#Here is the security