Как выполнить представление 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
Вернуться на верх