2013-06-11 96 views
2

如何強制urllib2 /請求模塊使用相對路徑而不是完整/絕對URL?urllib2 /請求和HTTP相對路徑

,當我使用的urllib2 /請求我看到我的代理其解析到發送請求:

GET https://xxxx/path/to/something HTTP/1.1 

不幸的是,服務器到我送它,無法體會到的請求,並給了我不可思議302.我知道它在RFC中,它不起作用,我試圖用python代碼修復它。我無法訪問該服務器。

相對路徑,效果很好

GET /path/to/something HTTP/1.1 
Host: xxxx 

所以,我怎麼能強迫請求/ urllib2的不使用絕對路徑?並使用簡單的相對路徑?

+1

難道'requests'需要知道在將其發送到首位域?我想我不明白這個問題。 – TankorSmash

+0

請發佈您的服務器/代理服務器的完整答案 –

回答

1

我覺得這裏有一點點困惑。根據RFC 2616只有絕對路徑絕對URI被允許在http請求行中。根本沒有這樣的事情相對 http請求 - 基本上http是無狀態的。

在你的問題,你在談論代理,即RFC境界清楚:

當請求被以代理所做的絕對URI形式是必需的。

本身,AFAIK,您的代理是而不是 HTTP/1.1兼容。這是商業產品還是內部開發?

順便說一下,HTTP 302是一個重定向。你確定資源並不是簡單地移到其他位置?


總之,通過查看源代碼或請求requests/models.py L276)恐怕它似乎並沒有什麼容易的方式來強制使用絕對路徑

我最好的辦法是按照advanced usages/Prepared request中描述的那樣在發送之前更改PreparedRequest對象。

4

也許下面的代碼會爲你的情況做:

from urlparse import urljoin 
import requests 

class RelativeSession(requests.Session): 
    def __init__(self, base_url): 
     super(RelativeSession, self).__init__() 
     self.__base_url = base_url 

    def request(self, method, url, **kwargs): 
     url = urljoin(self.__base_url, url) 
     return super(RelativeSession, self).request(method, url, **kwargs) 

session = RelativeSession('http://server.net') 
response = session.get('/rel/url')