首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django:在同一视图中设置会话和获取会话密钥

Django:在同一视图中设置会话和获取会话密钥
EN

Stack Overflow用户
提问于 2011-02-27 08:39:35
回答 2查看 38.8K关注 0票数 26

我希望在数据库中存储一些内容,并将当前会话用作外键:来自models.py

代码语言:javascript
复制
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))

要为这个模型创建一个新条目,我使用以下命令来获取当前会话(在views.py中):

代码语言:javascript
复制
Session.objects.get(session_key=request.session.session_key)

但是,如果这是用户第一次访问该站点,因此还没有设置cookie,则上面的代码将产生DoesNotExist错误。

我知道,即使现在设置了cookie,您仍然可以设置会话对象。因此,我可以想出一些技巧来实现这一点,例如:

Python设置唯一标识符作为session对象(除了session key)

  • Temporarily之外,还要存储我希望添加到数据库中的数据session对象,并在使用session之前使用装饰器函数检查它是否存在。
  • 只使用session对象,不在数据库中存储任何内容(这在技术上是可行的,但对于我的实现,它将依赖于-with几百个条目-在排序之类的事情上至少与数据库一样有效)。

但我想要一个我能接受的更好的解决方案。对于这个问题,有没有什么通用的或好的解决方案?或者我甚至在我的模型中正确地引用了会话?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-27 12:19:55

request.session是一个具有唯一session_key的SessionStore object

一旦访问了该属性,就会创建session_key。但是,只有在通过调用SessionStore对象的process_response方法处理完视图之后(在会话中间件的SessionStore方法中),session对象本身才会保存到数据库中。

这并没有真正的文档,但是看一下源代码,我猜你应该创建一个新的session对象,如下所示:

代码语言:javascript
复制
if not request.session.exists(request.session.session_key):
    request.session.create() 

您还可以创建自定义会话中间件,以确保您的新会话对象在任何视图尝试访问它之前始终可用:

代码语言:javascript
复制
from django.conf import settings
from django.contrib.sessions.middleware import SessionMiddleware

class CustomSessionMiddleware(SessionMiddleware):
    def process_request(self, request):
        engine = import_module(settings.SESSION_ENGINE)
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
        request.session = engine.SessionStore(session_key)
        if not request.session.exists(request.session.session_key):
            request.session.create() 

(当然,您必须通过settings.py中的SESSION_ENGINE引用新的会话中间件)

但请注意-如果用户的浏览器不支持cookies,这种方法将为每个请求生成一个新的会话对象。

票数 58
EN

Stack Overflow用户

发布于 2018-06-07 17:30:02

如果你想销毁会话,我建议首先使用django shell。

代码语言:javascript
复制
from django.contrib.sessions.models import Session
Session.objects.all() #you see all sessions
Session.objects.all().delete() 

在最后一个查询中,您可以根据需要进行过滤。并命中查询

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5130639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档