【问题标题】:jQuery POST to Django redirecting to GET with no datajQuery POST 到 Django 重定向到没有数据的 GET
【发布时间】:2013-11-16 19:56:05
【问题描述】:

我需要在提交表单之前将表单数据发布到 Django 视图。我尝试的所有方法都在同一点上失败。进行ajax调用的javascript是:

$('#lockdown-email-form input[type=text]').focusout(function() {
    var data = $('#lockdown-email-form form').serialize()    
    $.post("/lockdown-email", data)
})

而接收调用的python是:

def lockdown_email(request):
    msg = ''
    logger.info(request.method)
    if request.method == 'POST':
        form = LockdownEmailForm(request.POST)
        if form.is_valid():
            email_content = "Email:\n" + form.cleaned_data['email']
            mail_admins('Email for preview submission', email_content)
            msg = 'Thank you! Entering site.'
        else:
            msg = 'Email required'
    return HttpResponse(msg)

问题是每次发出请求时都会重定向到相同的 URL,但使用 GET 方法(从开发工具网络选项卡中查看),因此该功能不起作用。找了很久;一些建议与 CSRF 有关,但我在 settings.py 中禁用了它,但它仍然不起作用。

这是在 django-lockdown 页面上,虽然这个特定的例子不与锁定交互。有什么想法吗?

编辑:

urls.py

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

from app import views

urlpatterns = patterns('',
    url(r'^robots.txt$', TemplateView.as_view(template_name="app/robots.txt")),
    url(r'^$', views.index, name='index'),
    url(r'lockdown-email$', views.lockdown_email, name='lockdown_email'),
    url(r'get-locations$', views.get_locations, name='get_locations'),
    url(r'amend-data$', views.amend_data, name='amend_data'),
    url(r'feedback$', views.feedback, name='feedback'),
    url(r'contest-data$', views.contest_data, name='contest_data'),
)

【问题讨论】:

  • 你能发布你的urls.py吗? URL 是否需要为/lockdown-email/?如果 Django 正在创建重定向,这听起来可能是urls.py 中的路由问题。
  • 完成,感谢您的意见。如果是这样,我会感到惊讶,因为我的所有其他表单都可以使用相同的模式。
  • 我怀疑这会解决您的问题,但您的网址不应该在开头有 ^,例如url(r'^lockdown-email$'?现在它们的匹配范围太广了。
  • 似乎这是更好的方法,谢谢。但 no 并没有改变任何东西。
  • 我想知道这是否与 django-lockdown 停止请求有关。我只是在 settings.py 中进行了以下更改,但没有任何更改:LOCKDOWN_URL_EXCEPTIONS = (r'^/admin.*$', r'^lockdown-email$')

标签: jquery django post csrf lockdown


【解决方案1】:

嗯,我有一个临时的,非常不令人满意的解决方案。

出于某种我还不明白的原因(但很可能与 django-lockdown 相关),第一次发出 ajax POST 请求时它重定向到 GET,但第二次它的行为符合预期。所以我的解决办法就是把我的js改成这样:

$('#lockdown-email-form input[type=text]').focusout(function() {
    var data = "email=" + $('#lockdown-email-form input[type=text]').val()

    $.ajax({
        url: '/lockdown-email',
        type: 'POST',
        async: false,
        data: data,
    })
    $.ajax({
        url: '/lockdown-email',
        type: 'POST',
        async: false,
        data: data,
    })

})

使用 ajax not post 来确保同步请求。不过我会寻找更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2018-02-07
    • 2010-10-08
    • 2017-07-02
    • 2016-09-15
    相关资源
    最近更新 更多