Django WSGIRequest.get_full_path()不返回完整的URI

时间:2013-09-04 07:20:33

标签: python django azure

我写了一段Django代码来获取" tweets"来自" twitter"等网站在中国称为微博(确实问题与此任务无关)。这段代码在我的本地计算机Django测试Web服务器中正常运行(由命令python manage.py runserver启动)。

代码片喜欢这些:

def authsucc(request):
    APP_KEY = '5032*****'
    APP_SECRET = '367362***************'
    CALLBACK_URL = 'http://lifein.azurewebsites.net/weibo/authsucc.html'

    client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET,  redirect_uri=CALLBACK_URL)
    r = client.request_access_token(request.build_absolute_uri()[-32:])
    #return HttpResponse(request.get_full_path())

    access_token = r.access_token
    expires_in = r.expires_in
    client.set_access_token(access_token, expires_in)
    r = client.statuses.user_timeline.get()
    resp = ""
    for st in r.statuses:
        resp += st.text + "<br/>"

    return HttpResponse(resp)

但问题出在我在Windows Azure网站上部署网站(IIS 8.0网络服务器上的主机)之后。函数调用request.get_full_path()无法正常工作,只需返回&#34; weibo / authsucc.html&#34;而实际的请求是&#34; http://lifein.azurewebsites.net/weibo/authsucc.html?code=08e69b6acb825029f4fa5af1f7ed394d&#34;我在Django的调试模式中检查了本地var。部分内容:

request 
"<WSGIRequest\npath:/weibo/authsucc.html,\n
GET:<QueryDict: {}>,\n
POST:<QueryDict: >{}>,\n 
'HTTP_HOST': 'lifein.azurewebsites.net',\n
'HTTP_X_ORIGINAL_URL': '/weibo/authsucc.html?code=08e69b6acb825029f4fa5af1f7ed394d',\n
'IIS_UrlRewriteModule': '7.1.0761.0',\n 
'IIS_WasUrlRewritten': '1',\n
'PATH_INFO': u'/weibo/authsucc.html',\n
'PATH_TRANSLATED':'C:\\\\DWASFiles\\\\Sites\\\\LifeIn\\\\VirtualDirectory0\\\\site\\\\wwwroot\\\\handler.fcgi\\\\weibo\\\\authsucc.html',\n 
'QUERY_STRING': '',\n 
'REQUEST_METHOD': 'GET',\n 
'REQUEST_URI': '/weibo/authsucc.html?code=08e69b6acb825029f4fa5af1f7ed394d',\n                     'SERVER_SOFTWARE': 'Microsoft-IIS/8.0',\n 
'UNENCODED_URL': '/weibo/authsucc.html?code=08e69b6acb825029f4fa5af1f7ed394d',\n 
'URL': '/handler.fcgi',\n 
'wsgi.errors': <cStringIO.StringO object at 0x010392A0>,\n 
'wsgi.input': <cStringIO.StringI object at 0x012C9458>,\n 
'wsgi.multiprocess': True,\n 
'wsgi.multithread': False,\n 
'wsgi.run_once': False,\n 
'wsgi.url_scheme': 'http',\n 
'wsgi.version': (1, 0)}>"

我们可以看到&#39; REQUEST_URI&#39;和&#39; HTTP_X_ORIGINAL_URL&#39;请求的属性已正确设置,但GET QueryDict为空。 request.get_full_path()返回&#34; /weibo/authsucc.html"而不是例外&#34; /weibo/authsucc.html?code = 08e69b6acb825029f4fa5af1f7ed394d&#34;在本地服务器中。我想知道如何解决这个问题。有谁可以帮助我?

1 个答案:

答案 0 :(得分:1)

查询字符串不是uri路径的一部分。所以观察到的行为是正确的。这创建了一个新问题,如何从django.core.handlers.wsgi.WSGIRequest获取完整的uri对象。逻辑答案似乎是:

uri = '%s?%s' % (request.get_full_path, request.QUERY_STRING)

虽然这是作为重建创建的,但它不会为您提供用于执行http请求的确切uri。例如,没有办法区分/ path / from / path /? 。

要确定这一点,请务必直接访问原始http请求。我还没有能够做到这一点。当我找到合适的答案时,我会更新。