【问题标题】:CSRF token missing or incorrect explanationCSRF 令牌缺失或解释不正确
【发布时间】:2014-07-26 13:08:48
【问题描述】:

我只是一个初学者,从网上的一些教程开始,我不明白为什么这对我不起作用:

我的意见.py

from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from django.core.context_processors import csrf


class MainPage(View):
    def get(self, request):
        return render_to_response("helloworld.html")


class TestHandler(View):
    def post(self, request):
        q = {}
        q.update(csrf(request))
        #return render_to_response('test.html', q)
        return render_to_response('test.html', {'q':q}, context_instance=RequestContext(self.request))

    def get(self, request):
        q = self.request.GET.get('q')
    return HttpResponse(q) 

还有我的 urls.py

from django.conf.urls import patterns, include, url

from django.contrib import admin
from views import MainPage, TestHandler

admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
     url(r'^hello$', MainPage.as_view(), name='home'),
     url(r'^testform/', TestHandler.as_view()),

    url(r'^admin/', include(admin.site.urls)),

helloworld.html

>->-<html>
>->->-<head>
>->->->-<title>Hello, World!</title>
>->->-</head>
>->->-<body>
>->->->-<form method="post"  action="/testform/" >                                                                                                           
    {% csrf_token %}
>->->-<input name="q">
    <input type="submit">
</form>
>->->-</body>
>->-</html>

test.html

>-<body>
>-Hello {{q}}
>-</body>

这是在 django 1.6 上运行的,我阅读了大部分帖子但仍然无法弄清楚。

【问题讨论】:

    标签: django csrf


    【解决方案1】:

    不幸的是,您粘贴的内容有点混乱,您使用的是基于类的视图,但您将它们与基于函数的视图混合在一起(也缺少一半的声明)。

    在你的 settings.py 中启用 CSRF 中间件

    MIDDLEWARE_CLASSES = (
        ...
        'django.middleware.csrf.CsrfViewMiddleware',
        ...
    )
    

    将您的视图修复为正确的基于类的视图,您粘贴的内容完全错误:

    from django.views.generic import CreateView, TemplateView
    from django.core.urlresolvers import reverse_lazy
    
    
    # Create the form in your forms.py
    from .forms import (
        MyTestForm,
    )
    
    class MainPage(TemplateView):
        template_name = "test.html"
    
    class TestHandler(CreateView):
        form_class = MyTestForm
        template_name = "helloworld.html"
        success_url = reverse_lazy('home')
    

    创建您的表单模板:

    <html>
        <head>
            <title>Hello, World!</title>
        </head>
        <body>
            <form method="post"  action="/testform/">
                {% csrf_token %}
                <input name="q">
                <input type="submit">
            </form>
        </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 2014-12-25
      • 2011-12-26
      • 2014-03-29
      • 1970-01-01
      • 2014-02-26
      • 2021-10-01
      • 2021-11-13
      • 2012-04-20
      相关资源
      最近更新 更多