/ / Sesja dostępu / żądanie informacji poza widokami w Django - django

Uzyskaj dostęp do informacji o sesji / żądaniach poza widokami w Django - django

Muszę przechowywać specjalne pliki cookie pochodzące z aplikacji innych niż django. Mogę to zrobić w widokach

request.session[special_cookies"] = special_cookies

Ale w plikach py-non-views muszę uzyskać dostęp do tych specjalnych plików cookie.

Według docs, Mogę to zrobić

>>> from django.contrib.sessions.backends.db import SessionStore
>>> import datetime
>>> s = SessionStore(session_key="2b1189a188b44ad18c35e113ac6ceead")
>>> s["last_login"] = datetime.datetime(2005, 8, 20, 13, 35, 10)
>>> s["last_login"]
datetime.datetime(2005, 8, 20, 13, 35, 0)
>>> s.save()

Jeśli nie podam klucza sesji, Django to zrobiwygeneruj jeden dla mnie. Martwię się efektem uzyskania wielu nowych kluczy sesji. (Nie sądzę, żeby to było dobre, gdy masz wielu użytkowników, prawda ...?)

Chcę, aby użytkownik powiązał te specjalne pliki cookie z sesją użytkownika. jednak, Nie chcę zapisywać tego w profilu użytkownika,ponieważ ze względów bezpieczeństwa. Ten plik cookie jest generowany po zalogowaniu (nasza aplikacja wyśle ​​te specjalne pliki cookie). Chcemy wysyłać ten plik cookie w obie strony podczas sesji przeglądania.

Jak mam rozwiązać ten problem?

Dziękuję Ci bardzo!


#views.py
request.session["special_cookies"] = library.get_special(user, pwd)

#library.py
def get_special_cookies(user, pwd):
res = get_special_cookies("http://foobar.com/api/get_special_cookies", user, pwd)

#foobar.py  (also non-views)
def do_this(user, special_cookies)

Jestem prawie pewien, że to w porządku ....

#views_2.py
def dummy_views(request):
foobar.do_this(request.user, request.session["special_cookies"])

Ale są przypadki, w których nie chcę otrzymywać moich specjalnych plików cookie poprzez wyświetlanie / wywoływanie get_sepcial_cookies. Chcę, aby trwało to przez cały czas. A może zastanawiam się…?

Odpowiedzi:

6 dla odpowiedzi № 1

Aby wyjaśnić, dlaczego znajdujesz się w niebezpiecznej ścieżce, musimy pamiętać, dlaczego przede wszystkim wymyślono sesje po stronie serwera:

HTTP to protokół bezstanowy. Bezstanowy protokół nie wymagaserwer, aby zachować informacje lub status na temat każdego użytkownika przez czas trwania wielu żądań. Na przykład, gdy serwer WWW jest wymagany do dostosowania zawartości strony internetowej dla użytkownika, aplikacja internetowa może być zmuszona do śledzenia postępów użytkownika ze strony na stronę. Typowym rozwiązaniem jest stosowanie plików cookie HTTP. Inne metody obejmują sesje po stronie serwera, ukryte zmienne (gdy bieżąca strona zawiera formularz) oraz przepisywanie adresów URL przy użyciu parametrów zakodowanych w URI.

Django to bardzo dojrzały framework; jeśli jakiś celwydaje się trudne do osiągnięcia w Django, prawdopodobnie źle podchodzisz do problemu. Nawet jeśli możesz przechowywać informacje o sesji po stronie serwera bezpośrednio na zapleczu sesji, wydaje mi się to złym projektem, ponieważ dane sesji nie są istotne z zewnątrz.

IMHO, jeśli chcesz udostępnić dane uwierzytelniające / autoryzacyjne między aplikacjami, powinieneś naprawdę rozważyć coś takiego OAuth, inaczej skończysz z czymś niepewnym, delikatnym, brzydkim i trudnym do utrzymania.

(przepraszam, jeśli brzmi protekcjonalnie, angielski nie jest moim ojczystym idiomem).

[aktualizacja]

Cześć Paulo. Dziękuję Ci bardzo. Wydaje mi się, że mój zespół nie chce wprowadzać protokołu OAuth ani żadnej dodatkowej warstwy mechanizmu uwierzytelniania. Czy sprzeciwiasz się wstawianiu tych specjalnych plików cookie do HttpResponse.COOKIES?

Kilka uwag, jeśli naprawdę chcesz iść tą drogą:

  • będziesz ograniczony przez „tę samą domenę” (inna aplikacja powinna znajdować się w tej samej TLD)
  • powinieneś użyć pewnego rodzaju podpisu, aby uniknąć manipulowania plikami cookie

Czy to lepsze rozwiązanie niż request.session?

Istnieją pewne mechanizmy radzenia sobie z tego rodzaju problemem na wyższym poziomie. Na przykład:

  • jeśli chcesz, aby zmienna była obecna w każdym kontekście szablonu na podstawie wartości jakiegoś pliku cookie, możesz napisać niestandardowy procesor kontekstowy.
  • jeśli chcesz przekierować widoki w zależności od obecności pliku cookie, powinieneś napisać niestandardowy oprogramowanie pośrednie.

Nie mogę zapewnić bardziej konkretnego rozwiązania bezdalsze szczegóły na temat twoich celów, ale korzystając z tych haczyków możesz uniknąć powtarzania kodu w celu przetestowania zewnętrznego pliku cookie w każdym widoku - pamiętaj jednak, że wszystko, co dotyczy plików cookie, jest powiązane z kontekstem żądania / odpowiedzi i poza tym nie ma sensu.