Bottle Py: Activation de CORS pour les requêtes jQuery AJAX
Je suis en train de travailler sur une API RESTful d'un service web sur la Bouteille Framework Web et souhaitez accéder à des ressources avec jQuery, les appels AJAX.
À l'aide d'un client REST, la ressource interfaces fonctionnent comme prévu et de traiter correctement les GET, POST, ... demandes. Mais lors de l'envoi d'un AJAX de jQuery requête POST, les OPTIONS de contrôle en amont, la demande est tout simplement refusé '405: Méthode pas le droit".
J'ai essayé d'activer la SCRO sur la Bouteille serveur, comme décrit ici: http://bottlepy.org/docs/dev/recipes.html#using-the-hooks-plugin
Mais le after_request crochet n'est jamais appelé à la demande OPTIONS.
Voici un extrait de mon serveur:
from bottle import Bottle, run, request, response
import simplejson as json
app = Bottle()
@app.hook('after_request')
def enable_cors():
print "after_request hook"
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS'
response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
@app.post('/cors')
def lvambience():
response.headers['Content-Type'] = 'application/json'
return "[1]"
[...]
L'AJAX de jQuery appel:
$.ajax({
type: "POST",
url: "http://192.168.169.9:8080/cors",
data: JSON.stringify( data ),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){
alert(data);
},
failure: function(err) {
alert(err);
}
});
Le serveur enregistre uniquement une erreur 405:
192.168.169.3 - - [23/Jun/2013 17:10:53] "OPTIONS /cors HTTP/1.1" 405 741
$.post fonctionne, mais ne pas être en mesure d'envoyer des demandes PUT irait à l'encontre de l'objectif d'un service RESTful.
Alors, comment puis-je laisser les OPTIONS de contrôle en amont demande à être gérées?
source d'informationauteur Joern
Vous devez vous connecter pour publier un commentaire.
Installer un gestionnaire au lieu d'un crochet.
Il y a deux façons complémentaires que j'ai fait dans le passé: décorateur, ou d'une Bouteille de plugin. Je vais vous montrer à la fois et vous pouvez décider si l'un (ou les deux) d'entre eux en fonction de vos besoins. Dans les deux cas, l'idée générale est: un gestionnaire d'intercepte la réponse avant d'être envoyé au client, inserts de la SCRO en-têtes, puis procède à la récupération de la réponse.
Méthode 1: Installer Par route (Décorateur)
Cette méthode est préférable si vous ne voulez exécuter le gestionnaire sur certains de vos itinéraires. Juste décorer chaque itinéraire que vous souhaitez exécuter. Voici un exemple:
Méthode 2: Installation À L'Échelle Mondiale (Bouteille Plugin)
Cette méthode est préférable si vous souhaitez que le gestionnaire pour exécuter toutes ou la plupart de vos itinéraires. Vous aurez juste définir une Bouteille plugin une fois, et la Bouteille d'appeler automatiquement pour vous sur chaque itinéraire; pas besoin de spécifier un décorateur sur chacun d'eux. (Notez que vous pouvez utiliser un itinéraire
skip
paramètre pour éviter ce gestionnaire sur une route.) Voici un exemple qui correspond à celle ci-dessus:Voici une légère amélioration sur @ron.rothman la méthode n ° 2 pour l'installation de la SCRO gestionnaire à l'échelle mondiale. Sa méthode nécessite de préciser que le
OPTIONS
méthode est acceptée sur chaque route, vous déclarez. Cette solution s'installe mondiale gestionnaire pour tousOPTIONS
demandes.``
Envisagez de laisser votre serveur, pas la Bouteille, de définir les en-têtes.
Pas sûr que cela s'applique à votre situation, mais j'ai résolu le problème dans les projets passés en paramètre de la SCRO-têtes pour ma Bouteille application de Apache. Il est facile à configurer, garde mon code Python agréable et propre, et est efficace.
Information est disponible à partir de nombreuses sourcesmais si vous utilisez Apache, voici ce que ma config ressemble (plus ou moins):
Ne devrait pas vous être réellement à l'aide de cette?