2009-08-28 31 views
16

Próbuję utworzyć przekierowanie w widoku Django do zewnętrznego adresu URL z niektórymi parametrami pobierania dołączonymi do żądania. Po pewnym rozejrzeniu się i kilku próbach wydaje mi się, że trafiłem na blokadę.Zewnętrzne przekierowanie django z parametrami POST

Tak moim zdaniem wygląda coś takiego

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

to jest tak daleko, jak udało mi się dostać. Wiem, że w adresie URL żądania można określić kilka parametrów GET jak to:

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

Jednak ponieważ niektóre dane są poufne i nie chcę to skończyć w adresie URL. Ponieważ jest to zewnętrzny adres URL, nie mogę użyć skrótu redirect(), który akceptuje parametry widoku. Więc módl się, powiedz, w jaki sposób można wykonać takie zadanie?

Edit

Po zrobiwszy kilka rozglądać, i pobajdurzyliśmy w IRC, wydaje się, że to, co należy zrobić, aby utrzymać parametr uciec od użytkowników, zawierające informacje o płatności jest zamiast tego wyślij je jako post. Powiedziano mi, że powinieneś być w stanie to zrobić, używając również JS, być może jQuery. Pytanie pozostaje jednak nieco bardziej skomplikowane. W jaki sposób chciałbyś stworzyć przekierowanie postu w django przy pomocy javascript?

2-te Edit

Wydaje się, jakbym został wprowadzony w błąd. Dzięki za wyczyszczenie tego z protokołami przekierowania DR. Wygląda na to, że podążałem niewłaściwą ścieżką w mojej próbie użycia przekierowania do rozwiązania tego problemu.

Odpowiedz

18

Proponuję następujące podejście. W formularzu widoku widoku/szablonu Django do przeglądarki ze wszystkimi parametrami, które chcesz opublikować jako ukryte elementy formularza. Po załadowaniu formularza JavaScript przesyła formularz (POST) do dowolnego miejsca.

Widok:

from django.shortcuts import render_to_response 

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

Szablon:

<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

To sprytny sposób na uniknięcie przekierowania. Jest to jednak zależne od javascriptu, więc musiałbym również dokonać pełnej gracji degradacji. Zastanawiam się, jak gładko to będzie w praktyce, trzeba załadować stronę, zanim będzie można zrobić post js. – googletorp

+0

Tak, to rozwiązanie zależy od włączenia obsługi JavaScript w przeglądarce, ale nie oznacza to, że musisz to zrobić bezpośrednio na tej stronie. Powinieneś sprawdzić JavaScript zanim jeszcze dojdziesz do swojego widoku. Tak więc, jeśli nie jest włączona, użytkownik nie zajdzie nawet tak daleko. Jeśli chodzi o ładowanie strony, zależy to od tego, jak szybki jest powrót do widoku i jak duży jest wynik HTML. Jeśli masz tylko kilka pól, renderowanie strony, które zgaduję, odbyłoby się pod sekundą. Samo przekierowanie również jest szybkie, więc korzystanie z tego rozwiązania jest bardzo podobne do zwykłego przekierowania. –

+0

Ale jakie są implikacje tego rozwiązania dla bezpieczeństwa? Chcę POST parametry do bramy płatności. Czy wysyłanie poufnych danych, takich jak mój auth_id itp., Jest bezpieczne dla użytkownika? Czy nie ma innego sposobu? – sudshekhar

9

Parametry GET zawsze idą w adresie URL, dzięki czemu uzyskują parametry GET.

Przekierowanie nie jest możliwe przy użyciu parametrów POST (które nie wchodzą w adres URL) - jest to ograniczenie HTTP, a nie Django.

+0

Czy to oznacza, że ​​nie można przekierować na stronę płatności/okno, bez możliwości wyświetlenia przez użytkownika wszystkich danych przesyłanych razem? – googletorp

2

Nie zgadzam się z Danielem, nie sposób wokół ograniczenia HTTP przekierowanie tylko z params dostać. o czym myślę, to:

  1. Przekieruj do celu GET z żądanymi parametrami.
  2. Na stronie GET, ustaw formularz z przesłanymi paramami
  3. Automatyczne przesłanie formularza.

To jest to, co większość usług pobierania plików robi, a czasem nawet strony płatności (Paypal i tym podobne). to naprawdę trochę brzydka (1 więcej hop), ale ma swoje zalety.

+0

Automatyczne przesłanie formularza. czy możesz rozwinąć ten krok? Dzięki. – Clayton

+1

oczywiście. '' ' $ (dokument) .ready (function() { $ (" # your_form "). Submit(); }) ' '' –

Powiązane problemy