Dans Django, est-il possible d'accéder à la session utilisateur en cours à partir d'une balise personnalisée?

StackOverflow https://stackoverflow.com/questions/335231

  •  22-07-2019
  •  | 
  •  

Question

J'écris dans Django une balise personnalisée qui devrait générer une valeur stockée dans une session utilisateur, mais je ne trouve pas le moyen d'accéder à l'objet de session depuis une fonction de balise personnalisée. Est-il possible de le faire sans affecter manuellement l'objet de session à une variable de contexte?

Était-ce utile?

La solution

Vous devriez pouvoir ajouter le processeur de contexte de requête dans votre fichier settings.py:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',)

Cela fera la même chose que la réponse actuelle, sans avoir à ajouter de fichier personnalisé.

Autres conseils

Aucune infraction prévue pour Sebastian, cela semble être un hack utile à un moment donné, mais curieusement, le 24 décembre, dans une entrée de blog sur l'accès aux données utilisateur dans l'administrateur, James Bennett, responsable de la publication de Django, avait ceci à dire < a href = "http://www.b-list.org/weblog/2008/dec/24/admin/" rel = "noreferrer"> sur l'utilisation du hack threadlocal :

  

Un gros disclaimer: il existe de nombreuses utilisations potentielles pour ces types de fonctionnalités. Beaucoup d’entre eux ont tort et sont stupides et vous ne devriez pas les essayer. ... De plus, vous verrez parfois quelqu'un suggérer que ces fonctionnalités peuvent être obtenues par ce que l'on appelle le "threadlocal hack"; cela implique essentiellement de coller request.user à une sorte de variable magique disponible dans le monde entier, ce qui est très mauvais à utiliser si vous ne savez pas ce que vous faites. C’est aussi généralement une très mauvaise chose à utiliser, même si vous savez ce que vous faites, car vous le faites probablement parce que vous êtes paresseux et que vous n’avez pas envie de vous assurer de transmettre correctement les informations. Donc, si vous voyez quelqu'un vous suggérer de le faire en utilisant un "threadlocal", ignorez cette personne.

Ne dites pas que vous devriez ignorer Sebastian, mais cela pourrait valoir la peine de poursuivre sur d'autres voies plutôt que d'utiliser threadlocal, qui n'est pas considéré comme une meilleure pratique.

Vous pouvez le faire avec des processeurs de contexte personnalisés (voir http://docs.djangoproject.com/en/dev/ref/templates/api/ )

Dans ce cas, vous créez un nouveau fichier appelé context_processors.py au même niveau que votre fichier settings.py, contenant:

def add_session(request):
    return {'session': request.session}

Ensuite, dans votre fichier settings.py, ajoutez:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'context_processors.add_session',)

Vous pourrez maintenant faire référence au contexte ['session'] dans votre balise personnalisée.

Notez que cela ne fonctionnera que pour les modèles rendus avec un RequestContext attribué, comme dans le code suivant:

def test(request):
    return render_to_response('test.html',{}, context_instance=RequestContext(request))

J'ai trouvé cela utile: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

Vous pouvez utiliser un middleware pour récupérer les informations utilisateur et les stocker avec un fil de discussion local, puis les utiliser avec la définition de votre tag.

Utiliser render_to decorator à partir de django-annoying semble être la meilleure option (vue dans une autre question sur le dépassement de pile )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top