3

中国のweiboと呼ばれる「twitter」のようなWebサイトから「ツイート」を取得するDjangoコードを作成しました(実際、問題はこのタスクとは関係ありません)。このコードは、ローカル コンピューターの 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 Web サイト (IIS 8.0 Web サーバー上のホスト) に Web サイトを展開した後です。関数呼び出しは機能request.get_full_path()せず、実際の要求は " http://lifein.azurewebsites.net/weibo/authsucc.html?code=08e69b6acb825029f4fa5af1f7ed394d " ですが、"weibo/authsucc.html" を返すだけです。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?code=08e69b6acb825029f4fa5af1f7ed394d" の代わりに "/weibo/authsucc.html" を返します。この問題をどのように解決するのだろうか。誰でも私を助けることができますか?

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 に答える