আমার আগত জ্যাঙ্গোর অনুরোধে আমার JSON ডেটা কোথায়?


162

আমি জ্যাঙ্গো / পাইথনের সাথে আগত জেএসএন / আজাক্স অনুরোধগুলি প্রক্রিয়া করার চেষ্টা করছি।

request.is_ajax()হয় Trueঅনুরোধে, কিন্তু আমি কোন ধারণা যেখানে পে লোড JSON তথ্য সঙ্গে আছে।

request.POST.dir এটি রয়েছে:

['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__',
 '__delitem__', '__dict__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
 '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__setitem__', '__str__', '__weakref__', '_assert_mutable', '_encoding', 
'_get_encoding', '_mutable', '_set_encoding', 'appendlist', 'clear', 'copy', 'encoding', 
'fromkeys', 'get', 'getlist', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 
'keys', 'lists', 'pop', 'popitem', 'setdefault', 'setlist', 'setlistdefault', 'update', 
'urlencode', 'values']

অনুরোধ পোস্ট কীগুলিতে দৃশ্যত কোনও কী নেই।

আমি যখন ফায়ারবগে পোষ্টটি লক্ষ্য করি তখন অনুরোধে জেএসওএন ডেটা প্রেরণ করা হয়।


আপনি আসলে কি পোস্ট করছেন? আমাদের জাভাস্ক্রিপ্ট কল প্রদর্শন করুন।
ড্যানিয়েল রোজম্যান

এবং len(request.POST)এবং request.POST.items()সাহায্য করবে।
বিনয় সাজিপ

উত্তর:


233

আপনি যদি জ্যাঙ্গোতে জেএসএন পোস্ট করছেন তবে আমার মনে হয় আপনি চান request.body( request.raw_post_dataজাজানো <1.4 এ)। এটি আপনাকে পোস্টের মাধ্যমে প্রেরিত কাঁচা JSON ডেটা দেবে। সেখান থেকে আপনি আরও প্রক্রিয়া করতে পারেন can

এখানে জাভাস্ক্রিপ্ট, jQuery , jquery-json এবং জ্যাঙ্গো ব্যবহার করে একটি উদাহরণ রয়েছে ।

javascript:

var myEvent = {id: calEvent.id, start: calEvent.start, end: calEvent.end,
               allDay: calEvent.allDay };
$.ajax({
    url: '/event/save-json/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: $.toJSON(myEvent),
    dataType: 'text',
    success: function(result) {
        alert(result.Result);
    }
});

জ্যাঙ্গো:

def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.body   
    return HttpResponse("OK")

জ্যাঙ্গো <1.4:

  def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.raw_post_data
    return HttpResponse("OK")

'ক্লায়েন্ট ক্লায়েন্ট' বলতে কী বোঝায় দয়া করে ব্যাখ্যা করুন? আপনি কি করতে চেষ্টা করছেন?
জারেড কান্নিপ

আমি অভদ্র হওয়ার চেষ্টা করছি না: "পরীক্ষার ক্লায়েন্ট দ্বারা," মানে জাজানো "পরীক্ষার ক্লায়েন্ট" " পরীক্ষা ক্লায়েন্টের সাথে না থাকলে আপনি কীভাবে দর্শনগুলি পরীক্ষা করেন?
jMlines 20

4
মনে রাখবেন: আপনার স্ল্যাশ (/) চর দিয়ে ইউআরএলটি শেষ করা উচিত। @ সিএসআরএফ_কে ছাড় দিয়ে সিএসআরএফ নিষ্ক্রিয় করুন
দানি

46
এনবি আপনি যদি 1.4 ব্যবহার করছেন তবে এটিকে রিকোয়েস্ট.বডি বলা হবে। কাঁচা_পোস্ট_ডাটা অবচয় করা হয়েছে ...

3
জাঙ্গো ইউনিটেস্টের সাথে পরীক্ষা করার জন্য কেবল করুনself.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
ভিনসেন্ট

67

আমারও একই সমস্যা ছিল। আমি একটি জটিল জেএসওএন প্রতিক্রিয়া পোস্ট করছিলাম এবং আমি অনুরোধটি ব্যবহার করে আমার ডেটা পড়তে পারিনি Pপোস্ট অভিধান।

আমার JSON পোস্টের ডেটা ছিল:

//JavaScript code:
//Requires json2.js and jQuery.
var response = {data:[{"a":1, "b":2},{"a":2, "b":2}]}
json_response = JSON.stringify(response); // proper serialization method, read 
                                          // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
$.post('url',json_response);

এই ক্ষেত্রে আপনাকে অ্যারিয়ালাস দ্বারা সরবরাহিত পদ্ধতিটি ব্যবহার করতে হবে। অনুরোধটি পড়ুন। এবং json stdlib দিয়ে এটি deserialize করুন।

#Django code:
import json
def save_data(request):
  if request.method == 'POST':
    json_data = json.loads(request.body) # request.raw_post_data w/ Django < 1.4
    try:
      data = json_data['data']
    except KeyError:
      HttpResponseServerError("Malformed data!")
    HttpResponse("Got json data")

2
৪ র্থ লাইন নিয়ে আমার সমস্যা হচ্ছে: json_data = simplejson.loads(request.raw_post_data)আপনি কি নিশ্চিত যে সঠিকভাবে বলেছেন?
wfbarksdale

আমি নিশ্চিত যে অনুরোধ.আরও_পোস্ট_ডেটা সঠিক ফর্ম হিসাবে আমি পরীক্ষার ক্ষেত্রে এই উদাহরণটি ব্যবহার করেছি। আপনার কোন ধরণের সমস্যা নেই?
stricjux

1
কিছু অতিরিক্ত পাঠ্যে আসা ডেটা এটি খুব বেশি সংযুক্ত করে যা পার্সিংয়ের বিষয়টি স্ক্রু করে ফেলছিল। সুতরাং এটা আমার 100% ছিল।
wfbarksdale

4
django.utils.simplejsonসাম্প্রতিক সংস্করণগুলিতে সরানো হয়েছে। শুধু stdlib jsonলাইব্রেরি ব্যবহার করুন ।
মার্টিজান পিটারস


38

পদ্ধতি 1

ক্লায়েন্ট: হিসাবে প্রেরণ JSON

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    processData: false,
    data: JSON.stringify({'name':'John', 'age': 42}),
    ...
});

//Sent as a JSON object {'name':'John', 'age': 42}

সার্ভার:

data = json.loads(request.body) # {'name':'John', 'age': 42}

পদ্ধতি 2

ক্লায়েন্ট: হিসাবে প্রেরণ করুন x-www-form-urlencoded
(দ্রষ্টব্য: contentType& processDataপরিবর্তিত হয়েছে, JSON.stringifyপ্রয়োজন হয় না)

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',    
    data: {'name':'John', 'age': 42},
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',  //Default
    processData: true,       
});

//Sent as a query string name=John&age=42

সার্ভার:

data = request.POST # will be <QueryDict: {u'name':u'John', u'age': 42}>

1.5+ এ পরিবর্তিত হয়েছে: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests

HTTP অনুরোধগুলিতে নন-ফর্ম ডেটা :
অনুরোধ P POST আর এইচডিটিপি অনুরোধের মাধ্যমে পোস্ট করা ডেটা শিরোনামহীন ফর্ম-নির্দিষ্ট সামগ্রী নয় include পূর্ববর্তী সংস্করণগুলিতে, মাল্টিপার্ট / ফর্ম-ডেটা বা অ্যাপ্লিকেশন / x-www-form-urlencoded ব্যতীত সামগ্রী-প্রকারের সাথে পোস্ট করা ডেটা এখনও অনুরোধে উপস্থাপিত হবে Oপুতুন বৈশিষ্ট্য। এই ক্ষেত্রেগুলির জন্য কাঁচা পোষ্ট ডেটা অ্যাক্সেস করতে ইচ্ছুক বিকাশকারীদের অনুরোধের পরিবর্তে অনুরোধ.বডি বৈশিষ্ট্যটি ব্যবহার করা উচিত।

সম্ভবত সম্পর্কিত


3
পুনরায় 1 -django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
অ্যালেক্সভ্যালিজো

24

পাইথন 3 স্মরণে রাখা গুরুত্বপূর্ণ যে স্ট্রিংগুলি উপস্থাপন করার আলাদা উপায় রয়েছে - সেগুলি বাইট অ্যারে।

জ্যাঙ্গো ১.৯ এবং পাইথন ২.7 ব্যবহার করে এবং মূল শরীরে JSON ডেটা প্রেরণ (শিরোনাম নয়) আপনি এরকম কিছু ব্যবহার করতে পারেন:

mydata = json.loads(request.body)

তবে জ্যাঙ্গো 1.9 এবং পাইথন 3.4 এর জন্য আপনি ব্যবহার করতে পারেন:

mydata = json.loads(request.body.decode("utf-8"))

আমি আমার প্রথম পাই 3 জ্যাঙ্গো অ্যাপ্লিকেশনটি তৈরি করে এই শেখার বক্ররেখার মধ্য দিয়ে গেলাম!


3
তোমার ব্যাখার জন্য ধন্যবাদ! আমি জ্যাঙ্গো 1.10 এবং পাইথন 3.5 ব্যবহার করছি, মায়াডাটা = জসন.লোডস (অনুরোধ.body.decode ("utf-8")) কাজ করে!
জুলিয়া ঝাও

23

request.raw_responseএখন অবচয় করা হয়েছে। request.bodyএক্সএমএল পে-লোডস, বাইনারি চিত্রগুলি ইত্যাদির মতো অ-প্রচলিত ফর্ম ডেটা প্রক্রিয়া করার পরিবর্তে ব্যবহার করুন

ইস্যুতে জাজানো ডকুমেন্টেশন


9

জ্যাঙ্গোতে 1.6 অজগর 3.3

মক্কেল

$.ajax({
    url: '/urll/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(json_object),
    dataType: 'json',
    success: function(result) {
        alert(result.Result);
    }
});

সার্ভার

def urll(request):

if request.is_ajax():
    if request.method == 'POST':
        print ('Raw Data:', request.body) 

        print ('type(request.body):', type(request.body)) # this type is bytes

        print(json.loads(request.body.decode("utf-8")))

5

এইচটিটিপি পোস্ট পেওলড হ'ল বাইটের একটি সমতল গুচ্ছ। জ্যাঙ্গো (বেশিরভাগ ফ্রেমওয়ার্কের মতো) ইউআরএল এনকোড হওয়া প্যারামিটার বা MIME- মাল্টিপার্ট এনকোডিং থেকে অভিধানে ডিকোড করে। যদি আপনি কেবল পোস্টের সামগ্রীতে জেএসএন ডেটা ফেলে দেন তবে জ্যাঙ্গো এটি ডিকোড করবে না। হয় JSON সম্পূর্ণ পোস্ট সামগ্রী (অভিধান নয়) থেকে ডিকোডিং করছে; অথবা জাইসন ডেটাটিকে মাইমিমিটি-মাল্টিপার্ট মোড়কে রাখুন।

সংক্ষেপে, জাভাস্ক্রিপ্ট কোডটি দেখান। সমস্যা আছে বলে মনে হচ্ছে।


সমস্যা এখন দেখছি! Jquery এ টাইপ = 'জেসন' প্যারামিটারটি কোন প্রকারের প্রত্যাশা করা উচিত তা বোঝায়, এটি প্রেরণ করে না। এটি নিয়মিত ফর্ম পোস্ট এনকোডেড ডেটা প্রেরণ করছে, সুতরাং আমি যদি "জসন" প্রেরণ করতে চাই তবে আমি এটি কোনওরকম একটি স্ট্রিংয়ে রূপান্তর করতে হবে এবং "জসন = {ফু: বার,}" ইত্যাদি পাস করতে চাই তবে আমি বিশ্বাস করতে পারি না যে এটি বেশিরভাগ লোকেরা কীভাবে তা করে। আমার এখানে কিছু একটা ঘাটতি বলে মনে হচ্ছে।

প্রকৃতপক্ষে আপনি ফাংশনটিকে jsexry এ JSON স্ট্রিংয়ে .serialize () ফাংশন দিয়ে রূপান্তর করতে পারেন। তবে কেন আপনাকে বিশেষত জসন প্রেরণ করা দরকার? শুধু ফর্মের ডেটা প্রেরণে কী সমস্যা?
ড্যানিয়েল রোজম্যান

4
এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে কাঁচা ফর্ম ডেটা যথেষ্ট নয়; জেএসএন আপনাকে কেবল মূল নয়: মান জোড় নয়, শ্রেণিবিন্যাসের সামগ্রী পাঠাতে দেয় send আপনি নেস্টেড সেট, অ্যারে ইত্যাদি প্রেরণ করতে পারেন আপনি সম্ভবত পোস্ট ডেটা দিয়ে এগুলি সব করতে পারেন, তবে এটি তেমন সুবিধাজনক নয়।
টেক্সিলিয়ান


4

এটার মতো কিছু. এটি কাজ করেছে: ক্লায়েন্টের কাছ থেকে ডেটা অনুরোধ করুন

registerData = {
{% for field in userFields%}
  {{ field.name }}: {{ field.name }},
{% endfor %}
}


var request = $.ajax({
   url: "{% url 'MainApp:rq-create-account-json' %}",
   method: "POST",
   async: false,
   contentType: "application/json; charset=utf-8",
   data: JSON.stringify(registerData),
   dataType: "json"
});

request.done(function (msg) {
   [alert(msg);]
   alert(msg.name);
});

request.fail(function (jqXHR, status) {
  alert(status);
});

সার্ভারে অনুরোধ প্রক্রিয়া

@csrf_exempt
def rq_create_account_json(request):
   if request.is_ajax():
       if request.method == 'POST':
           json_data = json.loads(request.body)
           print(json_data)
           return JsonResponse(json_data)
   return HttpResponse("Error")

2
html code 

file name  : view.html


    <!DOCTYPE html>
    <html>
    <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script>
    $(document).ready(function(){
        $("#mySelect").change(function(){
            selected = $("#mySelect option:selected").text()
            $.ajax({
                type: 'POST',
                dataType: 'json',
                contentType: 'application/json; charset=utf-8',
                url: '/view/',
                data: {
                       'fruit': selected
                      },
                success: function(result) {
                        document.write(result)
                        }
        });
      });
    });
    </script>
    </head>
    <body>

    <form>
        <br>
    Select your favorite fruit:
    <select id="mySelect">
      <option value="apple" selected >Select fruit</option>
      <option value="apple">Apple</option>
      <option value="orange">Orange</option>
      <option value="pineapple">Pineapple</option>
      <option value="banana">Banana</option>
    </select>
    </form>
    </body>
    </html>

Django code:


Inside views.py


def view(request):

    if request.method == 'POST':
        print request.body
        data = request.body
        return HttpResponse(json.dumps(data))

-2

কৌণিক ব্যবহার করে আপনার অনুরোধ করতে হেডার যুক্ত করা উচিত বা এটি মডিউল কনফিগার শিরোনামগুলিতে যুক্ত করা উচিত: {'Content-Type': 'application/x-www-form-urlencoded'}

$http({
    url: url,
    method: method,
    timeout: timeout,
    data: data,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

-4

অনুরোধ.পস্ট কেবল একটি অভিধান-এর মতো অবজেক্ট, সুতরাং ডিক বাক্য বিন্যাসের সাথে এটিতে কেবল সূচক।

আপনার ফর্ম ক্ষেত্রটি ফ্রেড মনে করে আপনি এই জাতীয় কিছু করতে পারেন:

if 'fred' in request.POST:
    mydata = request.POST['fred']

পর্যায়ক্রমে, পোষ্ট ডেটা নিয়ে কাজ করার জন্য একটি ফর্ম অবজেক্ট ব্যবহার করুন।


আমি অনুরোধে খুঁজছিলাম O পোস্ট ['জসন'] যার কিছুই নেই। লেন 0

তাহলে ড্যানিয়েলের পরামর্শ অনুসারে এটি আপনার জাভাস্ক্রিপ্ট কলটি দেখতে অবশ্যই সহায়তা করবে।
বিনয় সাজিপ

13
অনুরোধ.পোজটি কেবল তখনই পপুলেট করা হয় যখন POST অনুরোধের বডি ফর্মটি এনকোড করা থাকে, অন্যথায় এটি খালি থাকে।
অস্পষ্টতা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.