Dajaxice:出现错误。

2 投票
2 回答
611 浏览
提问于 2025-04-19 07:31

我在使用 PyCharm(一个用于 Django 框架的开发工具),看起来一切正常,但我遇到了这个错误。

error: [Errno 10053] An established connection was aborted by the software in your host machine

当我在控制台查看时,点击 Dajaxice 回调按钮,它显示了这个信息。

Dajaxice: Something went wrong. 

这是我的模板:

 <input type="submit" class="btn btn-primary" value="Display" id="showbutton" onclick="Dajaxice.tbl.sayhello(my_js_callback);">

我的应用名称是 tbl,不知道为什么。

ajax.py

from django.utils import simplejson
from dajaxice.decorators import dajaxice_register

@dajaxice_register
def sayhello(request):
  return simplejson.dumps({'message':'Hello World'})

url.py

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

urlpatterns = patterns('',
                   url(r'^$', 'tbl.views.display_maps', name='home'),
                   url(r'^admin/', include(admin.site.urls)),
                   url(r'^accounts/auth/$', 'tbl.views.auth_view'),
                   url(r'^accounts/logout/$', 'tbl.views.logout'),
                   url(r'^profile/$', 'tbl.views.user_profile'),
                   url(r'^accounts/loggedin/$', 'tbl.views.loggedin'),
                   url(r'^accounts/invalid/$', 'tbl.views.invalid_login'),
                   url(r'^landinfo$', 'tbl.views.landpin_info'),
                   url(r'^simple-autocomplete/', include('simple_autocomplete.urls')),
                   url(dajaxice_config.dajaxice_url, include('dajaxice.urls')),
                )

我不知道哪里出错了。我按照 Dajaxice 的文档操作,但在运行应用时又出现了这个错误。

self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] An established connection was aborted by the software in your host machine

2 个回答

0

你正在使用哪个版本的Django?

Dajaxice这个项目已经停止更新了,跟Django 1.5以上的版本不兼容。(可以看看我之前的帖子。)

0

dajaxice的“出错了”提示可能是因为很多问题,比如你的Python函数里缺少参数名或者参数名拼错了,或者你的JavaScript函数里出现了异常。不过,你的例子很简单。Python函数里没有命名参数,而且你也没有提供JavaScript函数的代码。你的例子让我想起我自己调试过的一个类似问题。

这个问题和提交按钮的onclick处理有关。我认为,从提交按钮处理程序发起的ajax调用会在服务器处理通过提交表单生成的POST请求时同时进行。也就是说,服务器在完成ajax调用的响应之前就收到了POST请求,而这个POST请求会抢先处理,导致出现dajaxice的错误提示。

调试并找到根本原因比较复杂,但我进行了大量的测试,发现用Safari浏览器和Django的Python开发服务器时,这种情况是可以重复出现的。

浏览器和服务器都必须能够处理异步消息,ajax调用才能正常工作。我可能对服务器是否允许这种抢先处理的理解有误,也可能是你的浏览器的问题。不管怎样,最终结果都是一样的。

那么,如何避免这个问题呢?在我的情况下,我在表单中添加了一个隐藏的输入元素,并把我本来想用ajax发送的数据放到这个输入的值里。这样,隐藏的数据就会和其他表单数据一起自动发送,形成一个POST请求,当你提交表单时就会自动生成。

还有其他解决方案:通过ajax提交所有表单数据,并禁用表单数据的自动提交POST(使用Jquery AJAX提交HTML表单)。或者你可以使用一些与表单提交无关的事件,通过ajax将数据发送到服务器。

撰写回答