3

我写了一段 Django 代码来从中国称为 weibo 的“twitter”之类的网站获取“tweets”。(实际上问题与此任务无关)。这段代码在我的本地计算机 Django 测试网络服务器中正常运行(由命令: 启动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()不起作用,只返回“weibo/authsucc.html”,而实际请求是“ http://lifein.azurewebsites.net/weibo/authsucc.html?code=08e69b6acb825029f4fa5af1f7ed394d ”我检查了 Django 中的本地变量调试模式。部分内容:

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)}>"

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

4

1 回答 1

3

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

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

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

要确定这一点,需要直接访问原始 http 请求。我还不能做到这一点。当我找到有效的答案时,我会更新。

于 2013-10-15T15:04:53.897 回答