如何知道它是WSGI脚本中的ajax请求



我写了这个小小的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])

我想知道如何检测我收到ajax请求:当我使用 gunicorn 运行它并从 jQuery 使用 $.ajax(( 生成 ajax 请求时,我得到了 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)

我没有看到任何像HTTP_X_REQUESTED_WITH这样的信息,那么 Django 或金字塔如何知道它是一个 ajax 请求?

我发现了问题:

我有 2 台服务器:一台用于为具有 $.ajax(( 脚本的网页提供服务,另一台用于响应 ajax 请求。

浏览器不喜欢在与启动请求的网页相同的域 AND 端口上提供 ajax resquest。

就我而言,我在 localhost:6543 上提供了金字塔提供的网页,在 localhost:8222 上由 gunicorn 提供了 ajax 请求。

当在 localhost:6543 的同一台服务器上处理所有请求(页面 + ajax(时,没有更多问题,我得到了所有想要的标头。作为奖励,我什至在 $.ajax(( 函数中设置了标头(使用 2 台服务器时并非如此(。

现在是环境变量:

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)

如您所见,标头"HTTP_X_REQUESTED_WITH = XMLHttpRequest"是我想检测ajax请求的内容。

最新更新