1

我正在尝试向ajax PUT服务器发送一些带有请求的自定义数据,但服务器端未收到数据。以下是发送请求的方法。

    // Send ajax request
    $.ajax({
        type: "PUT",
        url: "/some/url/",
        data: {'verbose': true},
        contentType: "application/json",

        // Callbacks
        success: function(response) {},
        error: function(response) {},
        complete: function(response) {},
    });

以下是服务器收到的请求对象。

<WSGIRequest
path:/profile/cart/23/unsave/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{'_we_wk_ls_': '%7B%22time%22%3A1378973525509%2C%22luid%22%3A%2213789735255096b17d47fa3a67adb%22%7D',
 'csrftoken': '31qNsad14V33bovpnCnVh3WTaa44YQoM',
 'djdt': 'hide',
 'sessionid': 'qxpv1zshp05w777rfpr6mbl81irdzu3b'},
META:{'CELERY_LOADER': 'djcelery.loaders.DjangoLoader',
 'CLICOLOR': 'true',
 'COLORTERM': 'gnome-terminal',
 'COMPIZ_CONFIG_PROFILE': 'ubuntu',
 'CONTENT_LENGTH': '12',
 'CONTENT_TYPE': 'application/json; charset=UTF-8',
 u'CSRF_COOKIE': u'31qNsad14V33bovpnCnVh3WTaa44YQoM',
 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-EUBCf7VXvY,guid=5b8264e5a43262a19a9a7e1e00000039',
 'DEFAULTS_PATH': '/usr/share/gconf/ubuntu.default.path',
 'DESKTOP_SESSION': 'ubuntu',
 'DISABLE_AUTO_TITLE': 'true',
 'DISPLAY': ':0',
 'DJANGO_SETTINGS_MODULE': 'config.devel',
 'GATEWAY_INTERFACE': 'CGI/1.1',
 'GDMSESSION': 'ubuntu',
 'GIO_LAUNCHED_DESKTOP_FILE': '/usr/share/applications/terminator.desktop',
 'GIO_LAUNCHED_DESKTOP_FILE_PID': '3100',
 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated',
 'GNOME_KEYRING_CONTROL': '/tmp/keyring-YjGbUi',
 'GNOME_KEYRING_PID': '2036',
 'GPG_AGENT_INFO': '/tmp/keyring-YjGbUi/gpg:0:1',
 'GREP_COLOR': '1;32',
 'GREP_OPTIONS': '--color=auto',
 'HOME': '/home/amyth',
 'HTTP_ACCEPT': 'application/json, text/javascript, */*; q=0.01',
 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5',
 'HTTP_CONNECTION': 'keep-alive',
 'HTTP_COOKIE': 'csrftoken=31qNsad14V33bovpnCnVh3WTaa44YQoM; _we_wk_ls_=%7B%22time%22%3A1378973525509%2C%22luid%22%3A%2213789735255096b17d47fa3a67adb%22%7D; djdt=hide; sessionid=qxpv1zshp05w777rfpr6mbl81irdzu3b',
 'HTTP_HOST': '127.0.0.1:8000',
 'HTTP_REFERER': 'http://127.0.0.1:8000/some/url/',
 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0',
 'HTTP_X_CSRFTOKEN': '31qNsad14V33bovpnCnVh3WTaa44YQoM',
 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',
 'LANG': 'en_IN',
 'LANGUAGE': 'en_IN:en',
 'LC_CTYPE': 'en_IN',
 'LESS': '-R',
 'LOGNAME': 'amyth',
 'LSCOLORS': 'exfxcxdxbxegedabagacad',
 'LS_COLORS': 'di=38;5;222:fi=38;5;59:ln=38;5;116:ex=38;5;107:ow=48;5;33;38;5;230:tw=48;5;235;38;5;33',
 'MANDATORY_PATH': '/usr/share/gconf/ubuntu.mandatory.path',
 'OLDPWD': '/home/amyth',
 'ORBIT_SOCKETDIR': '/tmp/orbit-amyth',
 'PAGER': 'less',
 'PATH': '/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/amyth/arcanist-repo/arcanist/bin',
 'PATH_INFO': u'/profile/cart/23/unsave/',
 'PWD': '/home/amyth/Projects/blob',
 'QT_ACCESSIBILITY': '1',
 'QUERY_STRING': '',
 'REMOTE_ADDR': '127.0.0.1',
 'REMOTE_HOST': '',
 'REQUEST_METHOD': 'PUT',
 'RUN_MAIN': 'true',
 'SCRIPT_NAME': u'',
 'SERVER_NAME': 'localhost',
 'SERVER_PORT': '8000',
 'SERVER_PROTOCOL': 'HTTP/1.1',
 'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.7.3',
 'SESSION_MANAGER': 'local/amyth-workbook:@/tmp/.ICE-unix/2047,unix/amyth-workbook:/tmp/.ICE-unix/2047',
 'SHELL': '/usr/bin/zsh',
 'SHLVL': '1',
 'SSH_AGENT_PID': '2087',
 'SSH_AUTH_SOCK': '/tmp/keyring-YjGbUi/ssh',
 'TERM': 'xterm-256color',
 'TERMINATOR_UUID': 'urn:uuid:44ae86d1-9d00-4bfa-ba5e-7aaf089a776f',
 'TZ': 'Asia/Calcutta',
 'UBUNTU_MENUPROXY': 'libappmenu.so',
 'USER': 'amyth',
 'WINDOWID': '67108868',
 'XAUTHORITY': '/home/amyth/.Xauthority',
 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/etc/xdg',
 'XDG_CURRENT_DESKTOP': 'Unity',
 'XDG_DATA_DIRS': '/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/',
 'XDG_SEAT_PATH': '/org/freedesktop/DisplayManager/Seat0',
 'XDG_SESSION_COOKIE': 'e3eb0e8427880c0282433b5a0000000a-1381740618.104950-1684525435',
 'XDG_SESSION_PATH': '/org/freedesktop/DisplayManager/Session0',
 '_': '/usr/bin/python',
 'wsgi.errors': <open file '<stderr>', mode 'w' at 0xb73310d0>,
 'wsgi.file_wrapper': <class wsgiref.util.FileWrapper at 0x987de6c>,
 'wsgi.input': <socket._fileobject object at 0xb22387ac>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': True,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 0)}>

但是当我在浏览器中检查请求标头时,我可以看到添加到REQUEST_PAYLOAD. 以下是它的外观:

Request URL:http://127.0.0.1:8000/some/url/
Request Method:PUT
Status Code:200 OK
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:12
Content-Type:application/json
Cookie:_we_wk_ls_=%7B%22time%22%3A1378281143956%2C%22luid%22%3A%221378281143956452ac09ec7efaa23%22%7D; djdt=hide; PHPSESSID=fn7cliso1q9e3u9rk3dc4t8ra4; sessionid=4zc8di4r31w6siwy31frwu97t4z2on7w; csrftoken=RjmgBBv8IUQXhWwTVzoEhIhyLncU1OQN
Host:127.0.0.1:8000
Origin:http://127.0.0.1:8000
Pragma:no-cache
Referer:http://127.0.0.1:8000/profile/cart/
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
X-CSRFToken:RjmgBBv8IUQXhWwTVzoEhIhyLncU1OQN
X-Requested-With:XMLHttpRequest
Request Payload
verbose=true
Response Headersview source
Access-Control-Allow-Methods:POST,GET,OPTIONS,PUT,DELETE
Access-Control-Allow-Origin:*
Content-Type:application/json
Date:Wed, 16 Oct 2013 13:03:07 GMT
Server:WSGIServer/0.1 Python/2.7.3
Vary:Cookie

我检查了 Stack Overflow 上的其他问题和其他研究相同问题的博客,其中大多数建议数据应该随PUT请求一起发送。我还遇到了另一个问题,答案表明这是一个浏览器问题,这只发生在最新版本的 chrome 中。我认为可能是这样,但我在 FF 上检查了相同的内容,但它也不适用于 FF。

这是一个错误,还是我做错了什么?任何建议和/或帮助将不胜感激。

以下是我正在使用的:

  • jQuery 版本 1.8.0
  • Django 1.5 版
  • Chrome 版本 29.0.1547.76
  • 火狐版本 24.0

更新 0.1

这太疯狂了,我尝试将请求更改为“POST”请求,但仍然无法正常工作。数据未通过“POST”或“PUT”请求传递。但它适用于“GET”请求。

更新 0.2

如果我删除contentType: "application/json",或将其更改为contentType: "application/x-www-form-urlencoded"使用“POST”请求发送的数据,但它仍然不适用于PUT请求。:/

4

3 回答 3

1

当您将application/jsonContent-Type 删除或更改为application/x-www-form-urlencoded.

查看您的请求有效负载,您发送的内容类型为application/json但正文包含verbose=true,这不是 JSON 格式。另一方面,添加application/x-www-form-urlencoded符合verbose=true格式,因此它再次工作。

最好的办法是application/x-www-form-urlencoded在序列化整个表单时使用。

于 2013-10-16T17:50:18.747 回答
1

request.POST 将表单编码的数据处理成字典,这仅对 Web 浏览器表单提交有意义。PUT 没有等价物,因为 Web 浏览器不 PUT 表单;提交的数据可以具有任何内容类型。您需要从 request.raw_post_data 中获取原始数据,可能检查内容类型,然后处理它,但对您的应用程序有意义。

属性 PUT 和 DELETE 不在请求对象中,当您使用 ajax 调用时,Django 需要这样做: def update(self, request, pk=None):

    if request.is_ajax():
           aux = QueryDict(request.body)
           idParameter = auxiliar['Parameter1']# Read variables of PUT
    .........................................................................
    .........................................................................
    .........................................................................

与 DELETE 方法相同。

于 2014-09-18T13:03:50.533 回答
0

我刚刚深入研究了这一点,发现 Django 的 WSGIRequest 对象中加载 POST 数据的机制有一个子句将其专门限制为 POST 方法。

因此,对于您最初的问题“这是一个错误吗?还是我做错了什么”,我都不会说。这是 Django 的 WSGI 实现中未实现的功能。

在开发人员组的讨论或功能请求方面,我找不到任何有用的东西,所以社区似乎还没有任何调用来实现它。

对于我自己,我将扩展django.core.handlers.wsgi.WSGIRequest以加载 POST 数据,即使它是 PUT,并为我的项目提供自定义 WSGI 处理程序。

于 2013-12-04T15:25:34.977 回答