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リクエストと共に送信する必要があることを示唆しています。また、別の質問に出くわしました.答えは、それがブラウザの問題であり、これはクロムの最新バージョンでのみ発生することを示唆しています. たぶんそれだと思いましたが、FFでも同じことを確認しましたが、FFでも動作しません。

これはバグですか、それとも何か間違っていますか? 提案やヘルプをいただければ幸いです。

以下は私が使用しているものです:

  • jQuery バージョン 1.8.0
  • ジャンゴ バージョン 1.5
  • Chrome バージョン 29.0.1547.76
  • Firefox バージョン 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

request.POST は、フォームでエンコードされたデータをディクショナリに処理します。これは、Web ブラウザーのフォーム送信に対してのみ意味があります。Web ブラウザーはフォームを PUT しないため、PUT に相当するものはありません。送信されたデータは、任意のコンテンツ タイプを持つことができます。request.raw_post_data から生データを取得し、場合によってはコンテンツ タイプを確認し、それを処理する必要がありますが、アプリケーションにとって意味があります。

プロパティ PUT と DELETE は request オブジェクトにはありません。Django で ajax 呼び出しを使用している場合は、次のように実行する必要があります: 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 に答える
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 に答える