9

所以我得到了 Forbidden (403) CSRF 验证失败。请求中止。失败原因:CSRF 令牌丢失或不正确。
我的中间件类中有“django.middleware.csrf.CsrfViewMiddleware”。这是我的模板

<form name="input" action="/login/" method="Post"> {% csrf_token %}
<input type="submit" value="Submit"></form>

这是我的看法

from django.shortcuts import render_to_response
from django.core.context_processors import csrf
from django.template import RequestContext
def login(request):
     csrfContext = RequestContext(request)
     return render_to_response('foo.html', csrfContext)

好吧,我是 Django 和大多数 Web 开发的新手,但我似乎无法在这里找到问题。任何帮助将非常感激!

我也尝试过 django 文档中的方法

c = {}
c.update(csrf(request))
# ... view code here
return render_to_response("a_template.html", c)
4

6 回答 6

14

我和你有同样的问题,我发现这段代码可以解决我的问题。

from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render
from django.contrib import auth

#in accounts.forms i've placed my login form with two fields, username and password
from accounts.forms import LoginForm

@csrf_exempt
def login(request):
   if request.method == "POST":
      form = LoginForm(request.POST)
      if form.is_valid():
         user = auth.authenticate(
                username=form.cleaned_data["username"],
                password=form.cleaned_data["password"])
                auth.login(request, user)
                return HttpResponseRedirect("/")
      else:
         form = LoginForm()

return render(request, 'accounts/login.html', {'form':form})
于 2013-03-26T14:25:58.933 回答
7

尝试在登录功能之前添加 @csrf_protect 装饰器。

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def login(request):
     csrfContext = RequestContext(request)
     return render_to_response('foo.html', csrfContext)

如果表单不在 foo.html 中,那么您需要将 @csrf_protect 方法添加到生成它的视图函数中。

于 2012-10-04T16:12:54.573 回答
0

您应该执行以下操作:

def login(request):
     context = {}
     request_context = RequestContext(request)
     return render_to_response('foo.html', context,
                               request_context=request_context)

这是. _render_to_response

于 2012-10-04T16:08:25.613 回答
0

虽然禁用CSRF令牌并手动获取CSRF令牌值仍然有效。但是,在我的例子中,语法没有像 html 那样正确结构化,我们不担心我们的脚本设计,但我认为使用jinjaie 我们的模板语言很重要,是的,这就是我解决问题的方法。

于 2020-12-27T10:56:50.487 回答
0

转到 urls 并在视图方法/类 ex 旁边添加 .as_view()。

获取AuthTokenView.as_view()

于 2020-06-21T07:37:05.510 回答
-1

只需将其添加到您的 HTML 中:

{% csrf_token %}
于 2019-12-09T20:47:55.960 回答