我写了一段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;在本地服务器中。我想知道如何解决这个问题。有谁可以帮助我?
答案 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请求。我还没有能够做到这一点。当我找到合适的答案时,我会更新。