简体   繁体   中英

Django form submission & CSRF (403 Forbidden)

Upon providing valid data and submitting a form, I get the following: Forbidden (CSRF cookie not set.): /membership/success/ . I have a {% csrf_token %} in my template and my settings.py middleware is configured for CSRF.

#urls.py

from django.contrib import admin
from django.urls import path, include
from membership import views as ms_views

membership_patterns = ([
    path("", ms_views.RegistrationPage.as_view(), name="register"),
    path("success/", ms_views.SuccessPage.as_view(), name="success")
], 'membership')

urlpatterns = [
    path('admin/', admin.site.urls),
    path('membership/', include(membership_patterns, namespace="new_members"))
]

# membership/views.py

from django.shortcuts import render
from django.template.loader import get_template
from django.views import View
from django.http import HttpResponse, HttpResponseRedirect
from membership.forms import RegisterForm
from django.urls import reverse
# Create your views here.

class RegistrationPage(View):
    def get(self, request):
        register_page = get_template('membership/signup.html')
        register_form = RegisterForm()
        return HttpResponse(register_page.render({'form' : register_form}))

    def post(self, request):

        submitted_form = RegisterForm(request.POST)
        if submitted_form.is_valid():
            return HttpResponseRedirect(reverse('membership:success'))
        return HttpResponse(reverse('membership:register'))


class SuccessPage(View):
    def get(self, request):
        return HttpResponse("Success")
# signup.html

{% extends 'index.html' %}

{% block content %}
    <form action="{% url 'membership:success' %}" method='post'>
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
{% endblock %}

Once the form is submitted and valid, I'm expecting a 302 to occur. Like I said though I get 403 forbidden.

Since your success page has no logic, you can choose to exempt CSRF token for that. Import the following module

from django.views.decorators.csrf import csrf_exempt

and put @csrf_exempt at the start of function

    @csrf_exempt
    def get(self, request):
        return HttpResponse("Success")

Refer to https://docs.djangoproject.com/en/2.2/ref/csrf/

However, it is better to include {% csrf_token %} for each template you use to ensure consistent passing around of CSRF token

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM