我想将一些东西存储在数据库中,并使用当前会话作为外键: 来自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设置,你仍然可以设置会话对象。所以我可以想到一些黑客来完成这项工作,例如:
但我想要一个更好的解决方案,我可以忍受。这个问题是否有任何普遍使用或良好的解决方案?或者我甚至在我的模型中正确引用会话?
感谢您的帮助。
答案 0 :(得分:44)
request.session
是SessionStore object,具有唯一的session_key。
访问属性后立即创建session_key。但是会话对象本身只在通过调用SessionStore对象的save方法处理视图后(在会话中间件的process_response方法中)保存到数据库中。
它没有真正记录,但查看源代码我猜你应该创建一个像这样的新会话对象:
if not request.session.exists(request.session.session_key):
request.session.create()
您还可以创建自定义会话中间件,以确保在您的任何视图尝试访问它之前,您的新会话对象始终可用:
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引用你的新会话中间件)
但要注意 - 如果用户的浏览器不支持cookie,这种方法将为每个请求生成一个新的会话对象...
答案 1 :(得分:0)
如果你想破坏会话我建议更好的想法是先使用django shell。
from django.contrib.sessions.models import Session
Session.objects.all() #you see all sessions
Session.objects.all().delete()
在上次查询中,您可以根据需要进行过滤。并点击查询