Je souhaite conserver des informations sur les préférences d'utilisateurs dans une variable de session. Si l'utilisateur choisit une préférence lorsqu'il est déconnecté, puis se connecte ultérieurement, je souhaite que la préférence soit maintenue sans avoir à resélectionner. p>
Les sessions Django conservent une clé de session dans un cookie pour suivre une session d'utilisateurs. La façon dont je comprends bien, cette clé est modifiée lorsqu'un utilisateur se connecte. P>
a) Cela signifie-t-il que toutes les variables de session sont supprimées sur la connexion ou y a-t-il une sorte de PASSOVER P>
B) dans le cas de ne pas pouvoir enregistrer des préférences dans une connexion, définit manuellement des cookies la meilleure façon de procéder? J'imagine un scénario comme: p>
J'ai réussi à obtenir cette fonctionnalité en enregistrant des préférences dans l'objet de profil de l'utilisateur, ainsi que dans un cookie (ces préférences ne sont en aucun cas sensibles). Lorsque l'utilisateur est connecté, leur paramètre de profil prend la préférence. Lorsqu'il n'est pas connecté, la préférence de la cookie est choisie p>
5 Réponses :
Lorsque vous vous connectez / déconnecté Django affleurera toutes les sessions forts> si un autre utilisateur se connecte (demande.session.flush () dans auth / Vous préférez stocker les paramètres utilisateur dans la base de données et ajouter du middleware pour obtenir ces données et le stocker dans votre demande. P>
Les données utilisateur qui persistent comme il faut vivre dans quelque chose comme un userprofile code> modèle p>
Il sera écrit sur la base de données une fois que l'utilisateur se connecte, mais si l'utilisateur n'est pas connecté, j'aimerais toujours qu'ils puissent définir des préférences et une fois qu'ils finissent par se connecter, ces préférences seraient écrites à la UserProfile modèle pour que le problème maintient les données sur une connexion
Mais vous ne pouvez pas savoir si c'est la même personne ou simplement un autre utilisateur du même navigateur. Vous êtes donc heureux de supposer que c'est la même personne?
Pour les paramètres d'affichage simples Oui, mais les paramètres Les objets DB peuvent être marqués comme autorisé code> de sorte que seuls certains paramètres soient écrits dans un cookie pendant que tous sont écrits dans une session connectée.
Je pense vraiment que votre conception initiale a eu du sens. Si vous souhaitez enregistrer des variables de session sur la limite de connexion / déconnexion, vous pouvez faire quelque chose comme ceci.
from django.contrib.auth import views
@persist_session_vars(['HTTP_REFERER'])
def login(request, *args, **kwargs):
return views.login(request, *args, **kwargs)
C'est un bon début, mais n'est pas thread-coffre-fort! Depuis le persist_session_vars code> est instancié une fois, tous les utilisateurs écrivent sur le même session_backup code> dict (même en faisant une variable d'objet au lieu de l'attribut de classe ne change pas ici)
Lorsque deux utilisateurs se connectent en même temps, ils recevront la variable de session de chacun. Dans votre exemple, vos statistiques seraient désactivées. Toutefois, pour persister des informations personnelles de cette façon, il introduit une énorme fuite de sécurité / d'information sur le site Web.
Vous pouvez créer un mixin de formulaire qui vous permet de persister les valeurs de formulaire à la session de l'utilisateur (qui ne les oblige pas à être connectée). Ceci est utile pour des éléments tels que des options de filtrage / tri sur un rapport de vue de la table publique, où vous souhaitez conserver leurs options de filtrage persistantes sur rafraîchissements.
class PersistableMixin:
def persist_to_session(form, session):
for key in form.fields.keys():
val = getattr(form, 'cleaned_data', form.data).get(key, None)
if val: # will not store empty str values
session[key] = val
return True
def load_from_session(form, session):
for key in form.fields.keys():
saved_val = session.get(key, '')
if saved_val: # will not load empty str values
form.fields[key].initial = saved_val
return form
class StateListFilterForm(forms.Form, PersistableMixin):
states = forms.MultipleChoiceField(required=False, choices=US_STATES)
Lors de la connexion, Django appelle Si vous voulez garder un État, vous devrez restaurer cela après l'émission de la connexion. P> Le Solution de Chase Seibert a été un bon départ, il était très peu sûr en raison de problèmes de threadsafety dans ce code. Vous pouvez trouver une version améliorée ici, qui est sûre à utiliser: p> et maintenant vous pouvez écrire: p> Et pour des vues à base de cours (Django-Allauth): p> et utilisez cette vue dans les modèles d'URL: p> session.flush () code> ou session.cycle_key () code>, ce qui ne garantit que rien de l'ancienne session n'est conservé. Il s'agit d'une mesure de sécurité qui vous protège contre les vulnérabilités de fixation de la session. Donc, lors de l'application de cette solution, soyez conscient de ce que vous trouvez des variables que vous souhaitez persister. import allauth.urls
from django.conf.urls import include, url
from . import views
urlpatterns = [
# Views that overlap the default:
url(r'^login/$', views.LoginView.as_view(), name='account_login'),
# default allauth urls
url(r'', include(allauth.urls)),
]