Django: configuration d'une session et d'obtenir la clé de session dans la même vue
Je veux stocker des choses dans une base de données, et j'utilise la session en cours en tant que clé étrangère:
à partir de models.py
class Visited(models.Model):
session = models.ForeignKey(Session)
page = models.ForeignKey(Page)
times_visited = models.PositiveIntegerField()
ip_address = models.IPAddressField()
date_last_visited = models.DateTimeField()
def __unicode__(self):
return u'(%s, %s)' % (str(self.session.session_key), str(self.page.name))
De faire une nouvelle entrée pour ce modèle, je suis en utilisant ce qui suit pour obtenir la session en cours (en views.py):
Session.objects.get(session_key=request.session.session_key)
Toutefois, si c'est la première fois qu'un utilisateur a visité le site, et n'ont donc pas un cookie encore, le code ci-dessus va produire un DoesNotExist
erreur.
Je sais que même si il est maintenant cookie, vous pouvez toujours définir les objets de session. Donc, je peux penser à quelques hacks pour faire ce travail, tels que:
- Définir l'identificateur unique comme un objet de session (en plus de la clé de session)
- Stocker temporairement les données que je souhaite ajouter à la base de données d'un objet de session, et l'utilisation d'une fonction décorateur pour vérifier si elle existe avant de l'utiliser d'une session.
- Suffit d'utiliser la session d'objets et de ne rien stocker dans la base de données (cela serait techniquement possible, mais pour mon application, cela dépend de Python dictionnaires avec quelques centaines d'entrées - être au moins aussi efficace qu'une base de données pour des choses comme le tri).
Mais je voudrais une meilleure solution, je peux vivre avec. Y sont généralement utilisés ou les bonnes solutions à ce problème? Ou suis-je à même de référencement sessions correctement dans mon modèle?
Merci pour votre aide.
Vous devez vous connecter pour publier un commentaire.
request.session
est un SessionStore objet avec un unique session_key.La session_key est créé dès que l'attribut est accessible. Mais l'objet de la session elle-même n'est enregistré dans la base de données après le point de vue a été traitée (dans le process_response méthode de la session middleware) par appel à la méthode save de SessionStore objet.
Ce n'est pas vraiment documenté, mais en regardant le code source je suppose que vous êtes censé créer un nouvel objet de session comme ceci:
Vous pouvez également créer de session personnalisé middleware, qui fait que votre nouvelle session de l'objet est toujours disponible avant que l'un de vos points de vue tente d'y accéder:
(Bien sûr, vous devez faire référence à la nouvelle session middleware via le SESSION_ENGINE à l'intérieur de votre
settings.py
)Mais sachez - cette approche génère un nouvel objet de session pour chaque demande si le navigateur de l'utilisateur ne prend pas en charge les cookies ...
MIDDLEWARE_CLASSES
en plus de 'django.contrib.les sessions.middleware.SessionMiddleware " et aussiSESSION_ENGINE
? Sûrement référencement dansSESSION_ENGINE
les causes de cette ligne de répéter?engine = import_module(settings.SESSION_ENGINE)
. Suis-je à côté de l'essentiel?request.session.create()
définit laSet-Cookie
en-tête.request.session['foo'] = 'bar'
afin d'arrêterSessionMiddleWare
de l'exécution dedelete_cookie
.si vous voulez détruire la session, je voudrais suggérer une meilleure idée est de la première utilisation de django shell.
en dernière requête, vous pouvez filtrer en fonction de votre besoin. et frappé d'une requête