2013-09-04 2 views
1

Я написал фрагмент кода Django для получения «твитов» с веб-сайта, такого как «twitter», который называется weibo в Китае. (Действительно, проблема не связана с этим задача). Этот фрагмент кода работает правильно на моем локальном компьютере тестовый веб-сервер Django (запущен командой: python manage.py runserver).Django WSGIRequest.get_full_path() не возвращает полный URI

Код кусок любит это:

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 (Host на IIS 8.0 веб-сервер). Вызов функции request.get_full_path() не работал и просто возвращает «weibo/authsucc.html», в то время как фактический запрос «http://lifein.azurewebsites.net/weibo/authsucc.html?code=08e69b6acb825029f4fa5af1f7ed394d» Я проверил локальный var в режиме отладки 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» на локальном сервере. Интересно, как решить эту проблему. Может ли кто-нибудь мне помочь?

ответ

1

Эта строка не является частью пути к uri. Таким образом, поведение, которое наблюдается, является правильным. Это создает новый вопрос, как получить полный uri из объекта django.core.handlers.wsgi.WSGIRequest. Логические ответы, кажется:

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

Хотя это создает в реконструкции он не даст вам точный URI, который был использован для выполнения запроса HTTP. Например, невозможно отличить/path/from/path /? ,

Для этого обязательно требуется прямой доступ к необработанному HTTP-запросу. Я еще не смог этого сделать. Я обновлю, когда найду рабочий ответ.

+0

Вероятно, это зависит от версии, но request.get_full_path() имеет в нем параметры запроса в соответствии с документами еще в 1.6 (чьи документы заархивированы) – ThatsAMorais