web-dev-qa-db-fra.com

comment puis-je utiliser les données postées à partir d'ajax en flacon?

Je n'arrive pas à obtenir les données POSTées à partir de jquery ajax.

$('#clickme').click( function() {
    var data = save_input(); // data

    data['_sid'] = $survey_id;  // survey_id injected from flask
    data['_uip'] = $user_ip; // user_ip injected from flask, request.remote_addr

    $.ajax({
        type : "POST",
        url : "{{ url_for('mod.load_ajax') }}",
        data: JSON.stringify(data),
        contentType: 'application/json;charset=UTF-8',
        success: function(result) {
            console.log(result);
        }
    });

    console.log(data);
});

À partir du code, data est un objet javascript tel que

{
    'foo' : 'foo',
    'bar' : 'bar',
    'fo_' : 42,
}

ce que j'essaie de faire en fiole est:

@mod.route('/load_ajax', methods=["GET", "POST"])
def load_ajax():
    if request.method == "POST":
        # load _sid and _uip from posted JSON and save other data
        # but request.form is empty.
        # >>> request.form
        # ImmutableMultiDict([]) 
        return str(request.form)

voyez, la demande ajax est faite mais aucune donnée n'est soumise. Je fais console.log(data) avec ajax pour que je puisse voir que j'ai vraiment des données utiles dans la variable data dans jquery. mais request.form dans la vue ajax est vide. Où sont mes données soumises? 

57
thkang

Essayer 

 $.ajax({
    type : "POST",
    url : "{{ url_for('mod.load_ajax') }}",
    data: JSON.stringify(data, null, '\t'),
    contentType: 'application/json;charset=UTF-8',
    success: function(result) {
        console.log(result);
    }
});

Ensuite, depuis le serveur, vous pouvez vous référer aux variables dans les données comme ceci: 

request.json['foo']

Puisque le type de contenu est spécifié en tant que application/json, les données sont en request.json

62
phabtar

Selon votre exemple, vous n’envoyez pas de paire clé-valeur, mais vous affectez une chaîne JSON à l’option de données jQuery. Comme indiqué dans les commentaires, vous devez structurer votre JSON, créer un objet avec une clé (qui sera utilisée pour accéder à la chaîne JSON à partir d'un flacon), puis l'affecter à la clé de données jQuery.

    $.ajax({
            type : "POST",
            url : "{{ url_for('mod.load_ajax') }}",
            data: {json_str: JSON.stringify(data)},
            contentType: 'application/json;charset=UTF-8',
            success: function(result) {
                console.log(result);
            }
        });

    @mod.route('/load_ajax', methods=["GET", "POST"])
    def load_ajax():
        if request.method == "POST":
            # load _sid and _uip from posted JSON and save other data
            # but request.form is empty.
            # >>> request.form
            # ImmutableMultiDict([]) 
            return str(request.form['json_str']
     )
13
Ifthikhan

Avez-vous essayé de supprimer contentType? Vous supposez publier des données dans Flask.

pourriez-vous essayer d'ajouter de fausses données comme

data: {"hello": "world"} à l'intérieur de ajax? juste pour vérifier si le monde bonjour arrive à request.form

1
Granit

Du côté du ballon, utilisez:

data = request.get_json()

Les données variables ont maintenant le dictionnaire que vous avez envoyé avec ajax et vous pouvez maintenant le manipuler avec python

0
Patrick Mutuku