python - CSRF验证失败。请求中止。//Dajaxice,Ajax

标签 python django csrf django-csrf dajaxice

我正在使用 Daxice 库在我的 Django 应用程序中创建 AJAX 调用。 当我在表单上创建 POST 方法时,我收到上述错误:

Forbidden (403)
CSRF verification failed. Request aborted.

我的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',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.core.context_processors.request',
    'django.contrib.messages.context_processors.messages',
    'django.core.context_processors.csrf',
)

我的 urls.py

from django.conf.urls import patterns, include, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from dajaxice.core import dajaxice_autodiscover, dajaxice_config
dajaxice_autodiscover()

urlpatterns = patterns('',
    url(dajaxice_config.dajaxice_url, include('dajaxice.urls')),
    url(r'^$', 'apps.views.home'),
)

urlpatterns += staticfiles_urlpatterns()

我的观点.py:

from django.http import HttpResponse
from django.template import loader, Context

from django.core.context_processors import csrf

def home(request):
    t = loader.get_template('index.html')
    html = t.render(Context( ))
    return HttpResponse(html)

我的模板index.html:

{% load dajaxice_templatetags %}

<html>
  <head>
    <title>My base template</title>

    <script src="http://code.jquery.com/jquery-latest.min.js"
        type="text/javascript"></script>

    {% dajaxice_js_import %}

    <script type="text/javascript">

    function shout(data){
        alert(data.message)

    }

    </script>
  </head>
  <body>

    <form method="POST" action="">{% csrf_token %}
        Page: <input type="text" name="page"><br>
        From: <input type="text" name="from"> (From < To) <br>
        To: <input type="text" name="to"> (returns results before that day)<br>
        <input type="submit" onclick="Dajaxice.apps.hello(shout);" value="Submit">
    </form>

    <br>
    <br>

    <input type="button" onclick="Dajaxice.apps.hello(shout);" value="Get message from server!">

   </body>
</html>

还有我的 ajax.py:

import simplejson
from dajaxice.decorators import dajaxice_register

@dajaxice_register(method='GET')
@dajaxice_register(method='POST', name='other_post')
def hello(request):
    return simplejson.dumps({'message':'Hello from Python!'})

如果我单击该按钮,则会收到警报消息。当我提交表单时,我收到此错误。我该如何修复它?

最后我相信我已经修复了调试页面中 CSRF 显示的所有可能性:

In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been used correctly. For POST forms, you need to ensure:
Your browser is accepting cookies.
The view function uses RequestContext for the template, instead of Context.
In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.

最佳答案

好吧,我想我明白了。行中:

<form>
...
<input type="submit" onclick="Dajaxice.apps.hello(shout);" value="Submit"></form>
...
</form>

如果类型按钮,则它可以工作。它应该是服务器请求的 submit 行为。我不是解释为什么会发生这种情况的专家,所以如果有人可以解释我很乐意投票。

关于python - CSRF验证失败。请求中止。//Dajaxice,Ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18816472/

相关文章:

python - pickle Django 请求对象

python - os.path.split,在不影响路径的情况下更改文件名

apache - 如何防止跨站请求伪造攻击?

php - 防止 CSRF 漏洞,CSRF Token 的替代方法

python - 如何计算 Pandas 前 N 行的累计和?

python - 面向 MATLAB 程序员的 Python 科学计算

python - 对 Django 中的查询集中的一个字段求​​和

javascript - WebService [Get] 请求的安全问题?

python - 在 For 循环中制作列表列表

python - Django UpdateView 有空表格