标签: django-sessions

如何在Django测试框架中修改会话

我的网站允许个人在没有登录的情况下通过基于当前session_key创建用户来贡献内容

我想为我的视图设置一个测试,但似乎无法修改request.session:

我想这样做:

from django.contrib.sessions.models import Session
s = Session()
s.expire_date = '2010-12-05'
s.session_key = 'my_session_key'
s.save()
self.client.session = s
response = self.client.get('/myview/')
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

AttributeError: can't set attribute
Run Code Online (Sandbox Code Playgroud)

关于如何在获取请求之前修改客户端会话的想法?我已经看到了这个,它似乎并没有工作

python django django-testing django-sessions

29
推荐指数
3
解决办法
1万
查看次数

Django:会话数据库表清理

这个表是需要清除还是由Django自动处理?

python django django-sessions

27
推荐指数
2
解决办法
2万
查看次数

Django,SESSION_COOKIE_DOMAIN有多个域名

在Django中,我将SESSION_COOKIE_DOMAIN设置为我的域名.但我实际上想用两个不同的域名运行同一个站点.

设置SESSION_COOKIE_DOMAIN后,只有指定的域允许用户登录.是否可以允许两个域登录?

django django-sessions

21
推荐指数
2
解决办法
2万
查看次数

巨大的Django Session表,正常行为还是bug?

也许这是完全正常的行为,但我觉得这个django_session表比它应该的大得多.

首先,我每天运行以下清理命令,因此大小不是过期的会话引起的:

DELETE FROM %s WHERE expire_date < NOW()
Run Code Online (Sandbox Code Playgroud)

数字:

  • 我们每天都有大约5000名独立访客(机器人除外).
  • SESSION_COOKIE_AGE被设置为默认,2周
  • 该表有超过1,000,000行

所以,我猜测Django还会为访问该网站的所有机器人生成会话密钥,并且机器人不会存储cookie,因此它会不断生成新的cookie.

但是......这是正常行为吗?是否有一个设置,以便Django不会为匿名用户生成会话,或者至少......没有使用会话的用户没有会话?

django django-sessions

21
推荐指数
1
解决办法
5376
查看次数

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

我想将一些东西存储在数据库中,并使用当前会话作为外键:来自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))
Run Code Online (Sandbox Code Playgroud)

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

Session.objects.get(session_key=request.session.session_key)
Run Code Online (Sandbox Code Playgroud)

但是,如果这是用户第一次访问该站点,因此尚未设置cookie,则上述代码将产生DoesNotExist错误.


我知道即使现在有cookie设置,你仍然可以设置会话对象.所以我可以想到一些黑客来完成这项工作,例如:

  • 将唯一标识符设置为会话对象(除了会话密钥)
  • 暂时将我希望添加到数据库中的数据存储到会话对象中,并使用装饰器函数在使用会话之前检查它是否存在.
  • 只使用会话对象而不是在数据库中存储任何东西(这在技术上是可行的,但对于我的实现,它将依赖于Python字典 - 有几百个条目 - 至少与排序等数据库一样有效.)


但我想要一个更好的解决方案,我可以忍受.这个问题是否有任何普遍使用或良好的解决方案?或者我甚至在我的模型中正确引用会话?

谢谢您的帮助.

django django-models django-sessions

20
推荐指数
1
解决办法
3万
查看次数

最优化的方法是删除Django中特定用户的所有会话?

我使用Sessions Middleware和Auth Middleware运行Django 1.3:

# settings.py

SESSION_ENGINE = django.contrib.sessions.backends.db   # Persist sessions to DB
SESSION_COOKIE_AGE = 1209600                           # Cookies last 2 weeks
Run Code Online (Sandbox Code Playgroud)

每次用户从其他位置(不同的计算机/浏览器)登录时,Session()都会创建一个新的并使用唯一的方式保存session_id.这可能导致同一用户的多个数据库条目.他们的登录在该节点上持续存在,直到cookie被删除或会话到期为止.

当用户更改其密码时,我想从数据库中删除该用户的所有未到期会话.密码更改后,他们被迫重新登录.这是出于安全目的,例如,如果您的计算机被盗,或者您不小心将自己登录在公共终端上.

我想知道优化它的最佳方法.这是我如何做到的:

# sessions_helpers.py

from django.contrib.sessions.models import Session
import datetime

def all_unexpired_sessions_for_user(user):
    user_sessions = []
    all_sessions  = Session.objects.filter(expire_date__gte=datetime.datetime.now())
    for session in all_sessions:
        session_data = session.get_decoded()
        if user.pk == session_data.get('_auth_user_id'):
            user_sessions.append(session)
    return user_sessions

def delete_all_unexpired_sessions_for_user(user, session_to_omit=None):
    for session in all_unexpired_sessions_for_user(user):
        if session is not session_to_omit:
            session.delete()
Run Code Online (Sandbox Code Playgroud)

一个非常简化的视图:

# views.py

from django.http import HttpResponse …
Run Code Online (Sandbox Code Playgroud)

python django django-authentication session-cookies django-sessions

17
推荐指数
2
解决办法
1万
查看次数

如何清除所有会话变量而不退出

我试图清除所有会话变量但不注销当前用户.

user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True
Run Code Online (Sandbox Code Playgroud)

这还会影响网站的其他用户吗?

django django-sessions python-2.7

17
推荐指数
4
解决办法
3万
查看次数

如何在Django中注销用户?

我们的Django部署每晚都会检查哪些活动用户仍然可以在LDAP目录中找到.如果找不到它们,我们将它们设置为不活动状态.如果他们下次尝试登录,则会失败.这是我们的代码,它执行此操作:

def synchronize_users_with_ad(sender, **kwargs):
    """Signal listener which synchronises all active users without a usable
    password against the LDAP directory.  If a user cannot be
    found anymore, he or she is set to “inactive”.
    """
    ldap_connection = LDAPConnection()
    for user in User.objects.filter(is_active=True):
        if not user.has_usable_password() and not existing_in_ldap(user):
            user.is_active = user.is_staff = user.is_superuser = False
            user.save()
            user.groups.clear()
            user.user_permissions.clear()

maintain.connect(synchronize_users_with_ad)
Run Code Online (Sandbox Code Playgroud)

但如果他们仍然登录,则此会话仍然有效.我们怎样才能立即使它们无效?会话中间件的所有设置都是默认值.

python django django-authentication django-sessions

16
推荐指数
1
解决办法
1万
查看次数

Django,如何在管理界面中查看会话数据

我正在使用Django会话,我想在管理界面中查看会话数据.这可能吗?

即对于每个会话,我想看到存储在会话数据库中的数据(就我所能收集而言,这本质上是一个字典).

目前我只能看到该Session data字段中的哈希,例如:

gAJ9cQEoVQ5zb3J0aW5nX2Nob2ljZXECVQJQT3EDVQxnYW1lc19wbGF5ZWRxBH1xBVgLAAAAcG9z
dG1hbi1wYXRxBksDc1UKaXBfYWRkcmVzc3EHVQkxMjcuMC4wLjFxCFUKdGVzdGNvb2tpZXEJVQZ3
b3JrZWRxClUKZ2FtZV92b3Rlc3ELfXEMdS4wOGJlMDY3YWI0ZmU0ODBmOGZlOTczZTUwYmYwYjE5
OA==
Run Code Online (Sandbox Code Playgroud)


我已将以下内容放入admin.py中以实现此目的:

from django.contrib.sessions.models import Session
...
admin.site.register(Session)
Run Code Online (Sandbox Code Playgroud)


特别是我希望能够至少看到每个会话的IP地址.(如果我可以计算每个IP地址的会话数,并根据每个IP地址的总数来订购IP,那也会很好.)

谢谢您的帮助 :-)

python django django-sessions

15
推荐指数
2
解决办法
8510
查看次数

在django中测试会话变量

我遇到了Django Request.Session,我知道如何设置和测试它的特定值.

request.session['name'] = "dummy"
Run Code Online (Sandbox Code Playgroud)

我检查的某个地方

if request.session['name'] == "dummy" :
   #do something
Run Code Online (Sandbox Code Playgroud)

但是,现在我必须首先检查会话变量是否设置了?我是说如何检查是否存在价值Request.Session['name'] Is set

请任何人都可以打电话给我,有办法检查吗?

先感谢您.

django session-variables django-sessions

15
推荐指数
2
解决办法
1万
查看次数