我想将一些东西存储在数据库中,并且正在使用当前会话作为外键:
来自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))
为了为这个模型创建新的条目,我正在使用以下代码来获取当前会话(在views.py中):
Session.objects.get(session_key=request.session.session_key)
然而,如果用户第一次访问网站,因此还没有设置cookie,上面的代码将会产生一个“DoesNotExist”错误。我知道即使没有设置cookie,您仍然可以设置session对象。因此,我可以想到一些方法来解决这个问题,例如:
- 将唯一标识符设置为会话对象(除了会话密钥)。 - 暂时将要添加到数据库的数据存储为会话对象,并使用装饰器函数在使用会话之前检查其是否存在。 - 仅使用会话对象,不将任何内容存储在数据库中(从技术上讲,这是可能的,但对于我的实现,它取决于Python字典(带有几百个条目)是否至少与数据库一样有效,例如用于排序)。
但我希望有一个更好的解决方案。是否有任何通常使用或良好的解决方案来解决这个问题?或者我在我的模型中参考会话方式是否正确?
谢谢您的帮助。
MIDDLEWARE_CLASSES
中引用此类,除了'django.contrib.sessions.middleware.SessionMiddleware'和SESSION_ENGINE
之外?在SESSION_ENGINE
中引用它肯定会导致这行代码递归,难道我错了吗? - Steverequest.session.create()
不会设置Set-Cookie
头。 - Flimmrequest.session['foo'] = 'bar'
,以防止SessionMiddleWare
运行delete_cookie
。 - Flimm