【问题标题】:CSRF in Django failureDjango失败中的CSRF
【发布时间】:2012-12-27 01:16:08
【问题描述】:

为什么在存在 {% csrf_token%} 时出现以下错误?

禁止 (403) CSRF 验证失败。请求中止。

这是我使用的示例视图,很长。

view.py

def editModel(self,request, offset):
        if 'user' in request.session :
             user = request.session['user']
            if request.method == 'POST':
                if 'editModel' in request.POST:
                    offset = int(offset)
                    fields = ProfilModel.objects.filter(name=user)
                    workingModelsFiles = WorkingWithModelsFiles()
                    listModel = workingModelsFiles.getCurrentModel(user, offset)
                    modelView = self.listModels(user)[offset-1]
                    loadModels = "document.getElementById('x3dElement" + str(offset) + "').runtime.showAll();"
                    params = {'id ': offset,
                              'userName' : request.session['user'],
                              'surname' : fields[0].surname,
                              'listModel': listModel,
                              'model': modelView,
                              'bodyLoadModels': loadModels
                              }
                    params.update(csrf(request))
                    return render_to_response('editModel.html', params)

            else:
                offset = int(offset)
                fields = ProfilModel.objects.filter(name=user)
                workingModelsFiles = WorkingWithModelsFiles()
                listModel = workingModelsFiles.getCurrentModel(user, offset)
                modelView = self.listModels(user)[offset-1]
                loadModels = "document.getElementById('x3dElement" + str(offset) + "').runtime.showAll();"
                params = {'id ': offset,
                          'userName' : request.session['user'],
                          'surname' : fields[0].surname,
                          'listModel': listModel,
                          'model': modelView,
                          'bodyLoadModels': loadModels
                          }
                params.update(csrf(request))
                return render_to_response('editModel.html', params)
        else:
            return HttpResponseRedirect("/login/")

它出现在模板 {% csrf_token %} 中再次给我一个 csrf 错误

template.html

......
<div class="tab_container">
            <div id="tab1" class="tab_content">
                <table class="tablesorter" cellspacing="0"> 
                <tbody> 
                <form action="{% url 'edit_model' listModel.0.id_model  %}"  method="post" >
                {% csrf_token %}
                    {% for item in listModel %} 
                        <tr>
                            <td rowspan="3" style="width: 300px;"> {{ model | safe }} </td>
                            <td> Name Model: <i><input class="text_field" type="text" id='id_Model' name="Model" value="{{ item.modelName }}" /> </i> </td>
                        </tr>

                        <tr>
                            <td>  Author:  <i> <input class="text_field" type="text" id='id_Author' name="Author" value="{{ item.author }}" /> </i> </td>
                        </tr>
                        <tr>
                            <td> <input type="submit" name="editModel" value="Edit" /> </td>
                        </tr>
                    {% endfor %}
                </form>
                </tbody> 
                </table>
            </div><!-- end of #tab1 -->
.......

settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

【问题讨论】:

  • 确保 MIDDLEWARE_CLASSES contains 'django.middleware.csrf.CsrfViewMiddleware', 在你的 settings.py 中
  • 您是否尝试过使用render_to_responseRequestContext 进行csrf_token 处理,而不是使用params.update(csrf(request)) 手动进行?

标签: django django-forms django-templates


【解决方案1】:

您是否尝试过使用 RequestContext 而不是 params.update(csrf(request))? 喜欢:

params = {'id ': offset,
          'userName' : request.session['user'],
          'surname' : fields[0].surname,
          'listModel': listModel,
          'model': modelView,
          'bodyLoadModels': loadModels
          }
ctx = RequestContext(request, params)
return render_to_response('editModel.html', context_instance=ctx)

【讨论】:

  • 又是同样的错误。有趣的是,在 html-a 中如下。
    。在
    之后的所有内容和
    之间标记
  • 我认为您以错误的方式显示表单。应该是这样的:
    {% csrf_token %} {{ form.as_p}}
  • 即使你看不到我只是想把我送到一个我会的页面
  • 好的,我明白了。但是你为什么不使用 Django 风格的常规形式呢?是有原因还是只是因为你不知道怎么做?如果你不知道,你应该在这里阅读它,它很酷:docs.djangoproject.com/en/dev/topics/forms/…
猜你喜欢
  • 1970-01-01
  • 2012-09-08
  • 2015-06-02
  • 1970-01-01
  • 2023-03-30
  • 2017-03-29
相关资源
最近更新 更多