2015-03-04 2 views
0

Мне нужно перейти от AngularJS к python к объекту JSON. JSON будет:Как передать массив от AngularJS до python и хранить?

{ "name": "Bob", 
    "address": "Springfield", 
    "cars": [ 
    { "model": "Renault C15", "year": "1965" }, 
    ... 
    { "model": "Ford Ka", "year": "1998" } ] 
} 

Это фрагмент моего контроллера AngularJS. Все параметры вводятся из HTML формы (в данном случае массив «автомобили» были созданы вручную, чтобы показать вам, как я должен это запрограммировано)

$scope.cars= []; 
var car1 = { model: 'Renault C15', year: '1965' }; 
var car2 = { model: 'Ford Ka', year: '1998' }; 
$scope.cars.push(car1); 
$scope.cars.push(car2); 
... 
$scope.newForm = function() { 
    var dataToSend= { 
     name: $scope.name, 
     address: $scope.address, 
     cars: $scope.cars 
    }; 
    $http({ 
     method: 'POST', 
     url: '/myUrl/something', 
     data: $.param(dataToSend), 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
    }); 
    ... 
} 

Если я осмотреть запрос POST, я вижу следующие параметры :

name Bob 
address Springfield 
cars[0][model] Renault C15 
cars[0][year] 1965 
cars[1][model] Ford Ka 
cars[1][year] 1998 

Первоначально я не знаю, сколько предметов будет иметь «автомобили». Теперь это заголовок функции python. Я знаю, как хранить обычные аргументы, но я не знаю, как сделать то же самое с массивом «автомобили». Я бы сохранил его как список или словарь python.

def something(self, **params): 
    ... 
    name=params['name'] 
    address=params['address'] 
    ... 

Как хранить массив?

+0

Почему вы используете 'application/x-www-form-urlencoded'? –

+1

Похоже, вы пытаетесь отправить свой JSON в качестве параметров, верно? Почему бы просто не отправить его вместо данных? Затем вы можете использовать json import, чтобы превратить его в словарь или что хотите в этот момент. –

ответ

2

Я не расскажу вам о части AngularJS, поскольку это не в моих интересах, но я могу рассказать вам о CherryPy. Вам будет намного проще отправлять и обрабатывать ваши данные как application/json, поэтому я предлагаю вам избегать application/x-www-form-urlencoded и искать, как отправлять JSON с вашей клиентской библиотекой. С CherryPy, конечно, вы можете работать в обоих направлениях.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 


import cherrypy 


config = { 
    'global' : { 
    'server.socket_host' : '127.0.0.1', 
    'server.socket_port' : 8080, 
    'server.thread_pool' : 8 
    } 
} 

class App: 

    @cherrypy.expose 
    def index(self): 
    return '''<!DOCTYPE html> 
     <html> 
     <head> 
     <title>CherryPy demo</title> 
     <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script> 
     <script type='text/javascript'> 
      var data = { 
      "name": "Bob", 
      "address": "Springfield", 
      "cars": [ 
       { "model": "Renault C15", "year": "1965" }, 
       { "model": "Ford Ka", "year": "1998" } 
      ] 
      }; 

      $(document).ready(function() 
      { 
      $('#send-json').on('click', function() 
      { 
       $.ajax({ 
       'type'  : 'POST', 
       'dataType' : 'JSON', 
       'contentType' : 'application/json', 
       'url'   : '/jsonin', 
       'data'  : JSON.stringify(data), 
       'success'  : function(response) 
       { 
        console.log(response); 
       } 
       }); 
      }); 
      $('#send-form').on('click', function() 
      { 
       $.ajax({ 
       'type'  : 'POST', 
       'dataType' : 'JSON', 
       'url'   : '/formin', 
       'data'  : data, 
       'success'  : function(response) 
       { 
        console.log(response); 
       } 
       }); 
      });    
      }); 
     </script> 
     </head> 
     <body> 
     <p><a href='#' id='send-json'>Send JSON</a></p> 
     <p><a href='#' id='send-form'>Send form</a></p> 
     </body> 
     </html> 
    ''' 

    @cherrypy.expose 
    @cherrypy.tools.json_out() 
    def formin(self, **kwargs): 
    # You can just print a variable a see it in the terminal 
    # where CherryPy is executed 
    print(kwargs) 
    # You would see 
    # { 
    # 'cars[1][year]': u'1998', 
    # 'name': u'Bob', 
    # 'cars[0][model]': u'Renault C15', 
    # 'address': u'Springfield', 
    # 'cars[0][year]': u'1965', 
    # 'cars[1][model]': u'Ford Ka' 
    # } 
    return kwargs.items() 

    @cherrypy.expose 
    @cherrypy.tools.json_in() 
    @cherrypy.tools.json_out() 
    def jsonin(self): 
    data = cherrypy.request.json # just the same structure 
    return data.items() 


if __name__ == '__main__': 
    cherrypy.quickstart(App(), '/', config) 
+0

Он работает! Я ничего не знал о инструментах json, включенных в Cherrypy. Спасибо! – navaeta

Смежные вопросы