2017-05-18 2 views
1

je vous écris ce petit script WSGI:Comment le savoir est une requête ajax dans un script WSGI?

def application(environ, start_response): 
    data = '\n'.join(sorted(['%s = %s' % i for i in environ.items()])) 
    print data 
    start_response("200 OK", [ 
     ("Content-Type", "text/plain"), 
     ("Content-Length", str(len(data))) 
    ]) 
    return iter([data]) 

Je me demande comment puis-je détecter que je reçois une demande de paiement ajax: Quand je lance avec gunicorn et quand je produis une demande ajax avec .ajax $() de jQuery, je suis arrivé pour cette variable environ:

HTTP_ACCEPT = */* 
HTTP_ACCEPT_ENCODING = gzip, deflate, sdch, br 
HTTP_ACCEPT_LANGUAGE = fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
HTTP_ACCESS_CONTROL_REQUEST_HEADERS = 16hhs673uh 
HTTP_ACCESS_CONTROL_REQUEST_METHOD = GET 
HTTP_CONNECTION = keep-alive 
HTTP_HOST = localhost:8222 
HTTP_ORIGIN = http://localhost:6543 
HTTP_REFERER = http://localhost:6543/test2 
HTTP_USER_AGENT = Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 
PATH_INFO = /test2 
QUERY_STRING = name=John4&time=2pm 
RAW_URI = /test2?name=John4&time=2pm 
REMOTE_ADDR = 127.0.0.1 
REMOTE_PORT = 40668 
REQUEST_METHOD = OPTIONS 
SCRIPT_NAME = 
SERVER_NAME = 127.0.0.1 
SERVER_PORT = 8222 
SERVER_PROTOCOL = HTTP/1.1 
SERVER_SOFTWARE = gunicorn/19.7.1 
gunicorn.socket = <socket._socketobject object at 0x7f14844e51a0> 
wsgi.errors = <gunicorn.http.wsgi.WSGIErrorsWrapper object at 0x7f14844e47d0> 
wsgi.file_wrapper = <class 'gunicorn.http.wsgi.FileWrapper'> 
wsgi.input = <gunicorn.http.body.Body object at 0x7f14844e4950> 
wsgi.multiprocess = False 
wsgi.multithread = False 
wsgi.run_once = False 
wsgi.url_scheme = http 
wsgi.version = (1, 0) 

Je ne vois pas d'informations comme HTTP_X_REQUESTED_WITH, comment Django ou la pyramide peut connue, il est une demande de paiement ajax?

+0

Pourquoi devriez-vous vous préoccuper de savoir si le client attend une réponse ou la traite de manière asynchrone (ou quelle langue utilise-t-elle)? – UnholySheep

+0

Je veux vérifier cela pour des raisons de sécurité. – Eric

+0

Je ne suis pas vraiment sûr des raisons de sécurité, MAIS je ne peux pas le dire (puisque le client n'a aucune obligation d'envoyer de telles informations) - Je suppose que le 'HTTP_USER_AGENT' est le plus proche que vous puissiez savoir a été envoyé à partir d'un navigateur – UnholySheep

Répondre

0

Je trouve le problème:

J'ai eu 2 serveurs: un pour servir la page Web qui a le seul script .ajax $(), et une autre pour répondre à la demande ajax.

Les navigateurs n'aiment pas avoir ajax resquest non servi sur le même domaine AND port que la page Web qui lance la requête. Dans mon cas, j'avais les pages web servies par pyramid à localhost: 6543 et la requête ajax servie par gunicorn à localhost: 8222.

Lors du traitement de toutes les requêtes (pages + ajax) sur le même serveur à l'adresse localhost: 6543, plus de problème, j'ai tous les en-têtes voulus. En prime, j'ai même obtenu les en-têtes dans la fonction $ .ajax() (ce qui n'était pas le cas lors de l'utilisation de 2 serveurs).

Voici maintenant la variable environ:

HTTP_ACCEPT = */* 
HTTP_ACCEPT_ENCODING = gzip, deflate, sdch, br 
HTTP_ACCEPT_LANGUAGE = fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
HTTP_CONNECTION = keep-alive 
HTTP_HOST = localhost:6543 
HTTP_MY_CUSTOM_AJAX_HEADER = mycustomvalue 
HTTP_REFERER = http://localhost:6543/SomePath 
HTTP_USER_AGENT = Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 
HTTP_X_REQUESTED_WITH = XMLHttpRequest 
PATH_INFO = /dovote/1/SomePath 
QUERY_STRING = name=xxxxx&time=yyyyyy 
RAW_URI = /dovote/1/SomePath?name=xxxxx&time=yyyyyy 
REMOTE_ADDR = 127.0.0.1 
REMOTE_PORT = 39968 
REQUEST_METHOD = GET 
SCRIPT_NAME = 
SERVER_NAME = 0.0.0.0 
SERVER_PORT = 6543 
SERVER_PROTOCOL = HTTP/1.1 
SERVER_SOFTWARE = gunicorn/19.7.1 
gunicorn.socket = <socket._socketobject object at 0x7f090e131440> 
wsgi.errors = <gunicorn.http.wsgi.WSGIErrorsWrapper object at 0x7f09082e14d0> 
wsgi.file_wrapper = <class 'gunicorn.http.wsgi.FileWrapper'> 
wsgi.input = <gunicorn.http.body.Body object at 0x7f0908279d90> 
wsgi.multiprocess = False 
wsgi.multithread = False 
wsgi.run_once = False 
wsgi.url_scheme = http 
wsgi.version = (1, 0) 

Comme vous pouvez le voir, l'en-tête 'HTTP_X_REQUESTED_WITH = XMLHttpRequest' est ce que je voulais détecter une demande ajax. Pourquoi avez-vous besoin de savoir cela sur le serveur?