2009-08-28 14 views
16

リクエストにいくつかのgetパラメータを付けて、外部URLへのDjangoビューのリダイレクトを作成しようとしています。周りを見回して試してみた後、私は道のブロックを打ったようです。POSTパラメータを使用した外部djangoリダイレクト

だから、私の見解は、これは私の知る限り取得することができたようです。この

def view(request): 
    data = get.data(request) 
    if something in data: 
     return HttpResponseRedirect('example.com') 

ようになります。私はあなたが要求URLにこのようないくつかのGETパラメータを指定することができることを知っている:データの一部は敏感であるため

... 
return HttpResponseRedirect('example.com?name=smith&color=brown') 

は、しかし、私はそれがURLで終わるしたくありません。外部URLなので、viewパラメータを受け入れるredirect()ショートカットを使用することはできません。そのような仕事をどのように達成するのですか?

編集

いくつかは、より多くの周りを探して、IRCで少しおしゃべりしている行われた後、それは支払い情報を含む、離れてユーザーからのGETパラメータを維持するために、私は何をすべきと思われる、とあります代わりに投稿として送信してください。私はあなたもJSを使うことでそれをやることができるはずだと言われました。おそらくjQueryです。問題は今でももう少し複雑ですが、依然として残っています。どのように1つはジャンボのポストリダイレクトを作成するjavascriptの助けを借りて行くだろうか?

第二編集

は、私が誤解されているように思えます。 ThanxはリダイレクトプロトコルDRでこれをクリアします。この問題を解決するためにリダイレクトを使用しようとして間違った道を歩んできたように見えます。

答えて

18

私は次のアプローチを提案します。あなたのDjangoビュー/テンプレートでは、隠れたフォーム要素として投稿したいすべてのパラメータをブラウザに返します。フォームがロードされるとすぐに、JavaScriptは必要な場所に(POST)フォームを送信します。

ビュー:

from django.shortcuts import render_to_response 

def view(request): 
    return render_to_response('test.html', { 'foo': 123, 'bar': 456 }) 

テンプレート:

<html> 
<head> 
    <title>test</title> 
    <script type="text/javascript"> 
    function load() 
    { 
      window.document.test.submit(); 
      return; 
    } 
    </script> 
</head> 
<body onload="load()"> 
<form name="test" method="post" action="http://www.example.com"> 
    <input type="hidden" name="foo" value={{ foo }} /> 
    <input type="hidden" name="bar" value={{ bar }} /> 
</form> 
</body> 
</html> 
+0

これは、リダイレクトを回避する巧妙な方法です。しかし、これはjavascriptに依存しているので、やはり優雅な劣化が必要です。私は実際にどのようにスムーズになるのだろう、jsの投稿を行うことができる前にページを読み込まなければならないのだろうか。 – googletorp

+0

はい、この解決策はJavaScriptがブラウザで有効になっているかどうかに依存しますが、このページで正しく実行する必要はありません。あなたもあなたの視点に到達する前にJavaScriptをチェックする必要があります。したがって、それが有効になっていないと、ユーザーはこれまでのところさえ得られません。ページの読み込みは、ビューがどのくらい速く戻ってくるか、結果HTMLがどれだけ大きいかによって異なります。あなたが唯一のカップルのフィールドを持っている場合私は推測しているページのレンダリングは、秒未満の時間になるだろう。リダイレクト自体も速いので、このソリューションのユーザーエクスペリエンスは通常のリダイレクトと非常によく似ています。 –

+0

しかし、そのようなソリューションのセキュリティの意味は何ですか?私は支払いゲートウェイにPOSTパラメータを設定したい。私のauth_idなどの機密データをユーザーに安全に送信していますか?それ以外の方法はありませんか? – sudshekhar

9

GETパラメータは常にURLに格納されるため、GETパラメータになります。

POSTパラメータ(URLにはない)を使用してリダイレクトすることはできません。これはDjangoではなくHTTPの制限です。

+0

これは、ユーザーが送付されているすべてのデータを見ることができないまま、支払いサイト/ウィンドウにリダイレクトすることができないことを意味しますか? – googletorp

2

私はダニエルに同意しない、のgetのparamsでのみリダイレクトのHTTPの制限を回避する方法があります。私が考えていることは次のとおりです。

  1. 必要なパラメータでGETの宛先にリダイレクトします。
  2. GETページで、転送したパラメータを含むフォームを設定します。
  3. フォームを自動送信します。

これは、ほとんどのファイルダウンロードサービスや、場合によっては支払いページ(Paypalなど)のことです。それは実際に少し醜いです(1つのより多くのホップ)が、それ自身の利点があります。

+0

フォームを自動送信します。あなたはそのステップを詳しく教えていただけますか?ありがとう。もちろん – Clayton

+1

。 '' ' $(document).ready(function(){ $("#your_form ")submit(); }) ' '' –

関連する問題