首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用(CSRF cookie未设置):/paypal/分部Django

禁用(CSRF cookie未设置):/paypal/分部Django
EN

Stack Overflow用户
提问于 2019-09-15 23:22:07
回答 2查看 656关注 0票数 0

我与django-paypal有问题,问题发生在收到贝宝IPN时,付款是成功完成。

错误:

代码语言:javascript
复制
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:04] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:19] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:53:42] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:54:24] "POST /paypal/ HTTP/1.1" 403 2896
Forbidden (CSRF cookie not set.): /paypal/
[15/Sep/2019 22:55:45] "POST /paypal/ HTTP/1.1" 403 2896

我不知道发生了什么,我开始调查错误,但我没有取得多大成就,调查我把文件settings.py CSRF_COOKIE_SECURE作为True,即使这样也不起作用,有什么解决方案吗?

这是支付费用的代码:

代码语言:javascript
复制
def process_payment(request, pk):
    course = get_object_or_404(Course, pk = pk)
    host = request.get_host()

    paypal_dict = {
        'business': settings.PAYPAL_RECEIVER_EMAIL,
        'item_name': course.title,
        'amount': course.price,
        'currency_code': 'USD',
        'notify_url': 'http://{}{}'.format(host, reverse('paypal-ipn')),
        'return_url': 'http://{}{}'.format(host, reverse('course:list')),
        'cancel_return': 'http://{}{}'.format(host, reverse('payment_cancelled')),
    }

    form = PayPalPaymentsForm(initial = paypal_dict)
    return render(request, 'carts/process_payment.html', {'form': form, 'course': course})

更新

给出错误的视图不是我做的,来自django- paypal,它负责管理paypal,这个视图被称为ipn。意见如下:

https://github.com/spookylukey/django-paypal/blob/master/paypal/standard/ipn/views.py

这个视图就是notify_url

有关更多信息,这是我正在做的指南:https://overiq.com/django-paypal-integration-with-django-paypal/

以下是我的应用程序的urls.py:

代码语言:javascript
复制
urlpatterns = [
    path('cart/', CartDetailView.as_view(), name = 'cart'),
    path('cart-add/', views.add_course, name = 'add_course'),
    path('process-payment/<int:pk>/', views.process_payment, name='process_payment'),
    path('payment-cancelled/', views.payment_canceled, name='payment_cancelled'),

]

这些是urls.py的django-paypal ipn应用程序

代码语言:javascript
复制
urlpatterns = [
    url(r'^$', views.ipn, name="paypal-ipn"),
]

这是我的urlconf

代码语言:javascript
复制
urlpatterns = [
    path('django-admin/', admin.site.urls),

    # Paths of My Apps
    path('admin/', include(administration_patterns)),
    path('', include('core.urls')),
    path('', include('carts.urls')),
    path('', include(course_patterns)),
    path('paypal/', include('paypal.standard.ipn.urls')),

    # Paths of Auth
    path('accounts/', include('django.contrib.auth.urls')),
    path('accounts/', include('registration.urls')),
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-25 08:31:39

尝试将Paypal模式移至顶部,以确保请求实际上被路由到django-paypal

代码语言:javascript
复制
urlpatterns = [
    path('django-admin/', admin.site.urls),

    # Paths of My Apps
    path('paypal/', include('paypal.standard.ipn.urls')),
    path('admin/', include(administration_patterns)),
    path('', include('core.urls')),
    path('', include('carts.urls')),
    path('', include(course_patterns)),

    # Paths of Auth
    path('accounts/', include('django.contrib.auth.urls')),
    path('accounts/', include('registration.urls')),
]

,你为什么看到这个错误?

然后将请求路由到视图,视图不是csrf_exempt,因此CSRF中间件需要cookie。

由于请求是从Paypal服务器发送的,因此它不包含CSRF cookie,因此您将得到错误Forbidden (CSRF cookie not set.)

为什么请求被路由到错误的视图?

模式是在深度优先方法中匹配的,这意味着Django在尝试匹配'core.urls''carts.urls'course_patterns之前先尝试所有来自path('paypal/', include('paypal.standard.ipn.urls'))的模式。

其中一个包含的URL模式与路径/paypal/相匹配,可能类似于course_patterns中的path('<slug>/', course_view)

path('paypal/', include('paypal.standard.ipn.urls')),移到urlpatterns列表中,可以确保Django首先尝试匹配它。

票数 1
EN

Stack Overflow用户

发布于 2019-09-16 16:48:46

只需在表单呈现的模板上添加一个csrf令牌即可。

代码语言:javascript
复制
<form method="POST" action="/"> {% csrf_token %}
    {{ form }}

</form>

更新

您需要使正在处理/paypal/ csrf的视图获得豁免。我假设paypal试图在付款后将用户重定向到这个视图:

代码语言:javascript
复制
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def paypal_view(req):
...

更新2

试试这个:

代码语言:javascript
复制
from django.views.decorators.csrf import csrf_exempt

urlpatterns = [
    url(r'^$', csrf_exempt(views.ipn), name="paypal-ipn"),
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57948887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档