2010-12-06 3 views
0

J'ai un javascript qui effectue un appel "POST" via javascript (pas de bibliothèques) vers un site local fonctionnant sur un port différent. Si ce site utilise une application avec mod_python, cela fonctionne. S'il exécute une application utilisant Tornado - il échoue avec une erreur 405. J'ai été sûr d'implémenter des méthodes post() et options() sur le gestionnaire, et il est toujours en train de commettre des erreurs. Puisque cela fonctionne avec mod_python, cela doit être possible. Quelqu'un sait comment obtenir Tornado pour accepter les demandes de la même adresse IP, mais un port différent? (Je fais cela localement pour les tests, et je m'en fiche des problèmes de sécurité).Requête Ajax avec Python Tornado Obtenir un 405

Répondre

0

Quelque chose d'étrange se passe ici - mais ce n'est pas ce que vous pensez.

La règle de même origine pour Ajax empêche réellement les demandes d'adresse différente, même si cette adresse diffère simplement par le numéro de port. Voir wikipedia's definition de la politique.

La question est donc de savoir pourquoi la version mod_python fonctionne? Par exemple, êtes-vous sûr que mod_python écoute sur le port que vous pensez qu'il est? À quoi ressemble le Javascript, et comment détermine-t-il où il est publié?

+0

Il ne semble pas que cela fonctionne, cela fonctionne. mod_python écoute sur le port 9000. Le test js est servi depuis le port 8000. Le code Tornado écoute sur 9001. La seule chose que je peux penser, c'est que puisque le code de test passe par la même instance d'apache, il fonctionne malgré les différences de port. Mais c'est un coup de couteau dans le noir de ma part. – Dan

0

Il serait utile de voir à la fois votre objet RequestHandler, ainsi que la manière dont vous distribuez les URL dans Tornado. À ma connaissance, seules les implémentations de méthode HTTP manquantes ou une définition d'options manquantes() provoqueraient l'émission d'un 405 par 0. tornade

Peut-être que le problème n'est pas que vous n'implémentez pas les bonnes méthodes, mais que l'url vous ' re appel n'est pas envoyé comme vous le pensez.

Que disent les bûches? Exécutez-vous tornade en mode débogage? Pendant que je pose des questions, quelle version de tornade utilisez-vous? Essayez de mettre tornado en mode débogage et ajoutez des messages logging.debug pour vous assurer que votre requête parvienne même à votre RequestHandler, et pour en savoir plus sur ce qui se passe.

Pour exécuter en mode débogage, avec tornado 1.1 (peut-être 1.0? Ne me souviens pas), vous pouvez simplement démarrer votre application avec '--logging = debug'. En supposant que vous avez des appels logging.debug dans votre gestionnaire, vous obtenez des messages :)

Voici un gestionnaire d'exemple en utilisant la démo helloworld.py inclus:

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     logging.debug("I'm in ur hndlrz, runnin yr codez") 
     self.write("Hello, world") 

Voici la sortie du journal:

furby:helloworld jonesy$ ./helloworld.py --logging=debug 
[D 101207 16:12:34 helloworld:28] I'm in ur hndlrz, runnin yr codez 
[I 101207 16:12:34 web:849] 200 GET/(127.0.0.1) 1.03ms 
[W 101207 16:12:34 web:849] 404 GET /favicon.ico (127.0.0.1) 0.34ms 
Questions connexes