AJAX请求在Tornado中重定向:它有效,但我不明白

时间:2017-06-25 13:08:52

标签: python tornado

我正在构建一个家庭网络电台服务器。基本上,设备与我的家庭服务器通信,将请求重定向到真正的网络无线电服务器。我解析返回的HTML以更改播放按钮的绑定,使它们在主服务器而不是设备上播放。它运作得很好。

我使用tornado,我的主要处理程序是:

class MainHandler(tornado.web.RequestHandler):
    def get(self, url):
        query = ''
        if self.request.query:
            query = '?' + self.request.query
        url = base_url + urllib.request.quote(url) + query # base url is the real server address
        raw_data = opener.open(url).read()
        data = filter_data(raw_data) # parse HTML with Beautiful soup
        self.write(data)

    def post(self, url): # exclusively AJAX calls
        url = base_url + urllib.request.quote(url)
        request = urllib.request.Request(url, data=self.request.body, method='POST')
        data = opener.open(request).read().decode('utf-8')
        try:
            json.loads(data)
            self.set_header('Content-Type', 'application/json')
        except json.decoder.JSONDecodeError:
            self.set_header('Content-Type', 'text/html; charset=utf-8')
        self.write(data)

开场白是必需的:

cj = CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))

我不明白它是如何工作的:我使用urllib.request构建的请求没有标题,那么远程服务器如何回复?

问题在于它仅适用于Tornado请求的上下文。如果我尝试在它之外做同样的事情,它就不起作用了:

def get_song(radioUID):
    url = base_url + 'fr/OnAir/GetCurrentSong' # same url that works in tornado
    data = bytes(json.dumps({ 'radioUID': radioUID}), encoding='utf-8')
    request = urllib.request.Request(url, data=data, method='POST')
    response = opener.open(request).read().decode('utf-8')
    print(response)

答案总是'false'而不是预期的json对象。任何人都可以帮助我吗?

0 个答案:

没有答案