web-dev-qa-db-ja.com

POST in Django restapiを使用したJson解析エラー

Django RESTフレームワークを介して単純なGET/POSTAPIを実装しようとしています

views.py

class cuser(APIView):
def post(self, request):
   stream  = BytesIO(request.DATA)
    json = JSONParser().parse(stream)
    return Response()

urls.py

from Django.conf.urls import patterns, url
from app import views
urlpatterns = patterns('',

           url(r'^challenges/',views.getall.as_view() ),
           url(r'^cuser/' , views.cuser.as_view() ),
      )

POSTいくつかのjsonを/api/cuser/にしようとしています(apiは私のプロジェクトのurls.pyの名前空間です)、JSON

{
"username" : "abhishek",
"email" : "[email protected]",
"password" : "secretpass"
}

ブラウズ可能なAPIページとhttpieの両方から試しました(A python curlに似たツールになりました)

httpie command

http --json POST http://localhost:58601/api/cuser/ username=abhishek [email protected] password=secretpass

しかし、JSON解析エラーが発生しています:

JSON parse error - Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Whole Debug message using --verbose --debug

    POST /api/cuser/ HTTP/1.1

Content-Length: 75

Accept-Encoding: gzip, deflate

Host: localhost:55392

Accept: application/json

User-Agent: HTTPie/0.8.0

Connection: keep-alive

Content-Type: application/json; charset=utf-8



{"username": "abhishek", "email": "[email protected]", "password": "aaezaakmi1"}

HTTP/1.0 400 BAD REQUEST

Date: Sat, 24 Jan 2015 09:40:03 GMT

Server: WSGIServer/0.1 Python/2.7.9

Vary: Accept, Cookie

Content-Type: application/json

Allow: POST, OPTIONS



{"detail":"JSON parse error - Expecting property name enclosed in double quotes: line 1 column 2 (char 1)"}
7
user001

発生している問題は、リクエストがすでに解析されており、もう一度解析しようとしていることです。

From "パーサーの決定方法"

ビューの有効なパーサーのセットは、常にクラスのリストとして定義されます。 request.dataにアクセスすると、RESTフレームワークは、着信リクエストのContent-Typeヘッダーを調べ、リクエストコンテンツの解析に使用するパーサーを決定します。

コードでは、request.DATAにアクセスしています。これはrequest.dataの2.4.xに相当します。したがって、リクエストはそれを呼び出すとすぐに解析され、request.DATAは実際に解析する予定の辞書を返します。

json = request.DATA

着信JSONデータを解析するために必要なのは本当にすべてです。あなたは本当にPython辞書をjson.loadsに渡していましたが、それを解析できないようです。そのため、エラーが発生していました。

9
Kevin Brown

「詳細」についてGoogle経由でこの投稿にアクセスしました:「JSON解析エラー-二重引用符で囲まれたプロパティ名が必要です:」。JSONで末尾のカンマを使用できないことが判明しました。したがって、このエラーが発生した場合は、次のように投稿を変更します。

{
    "username" : "abhishek",
    "email" : "[email protected]",
    "password" : "secretpass",
}

これに:

{
    "username" : "abhishek",
    "email" : "[email protected]",
    "password" : "secretpass"
}

JSONオブジェクトの最後のプロパティの後に削除されたコンマに注意してください。

6
Colton Hicks

基本的に、requests libを使用してPOSTリクエストを作成しようとすると、このライブラリにはjson引数も含まれます。これは、data引数がfilesまたはdataに設定されている場合は無視されます。したがって、基本的にjson引数がjsonデータで設定されている場合。ヘッダーは_Content-Type: application/json_として設定されます。 Json引数は基本的にデータをエンコードjson形式で送信します。そのため、DRFでは特にparse json dataを実行できます。それ以外の場合、データ引数のみの場合は、フォームエンコードとして扱われます

requests.post(url, json={"key1":"value1"})

あなたはここでもっと見つけることができます request.post複雑なpostメソッド

0
Shishir