我的网站允许个人在没有登录的情况下通过基于当前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)
关于如何在获取请求之前修改客户端会话的想法?我已经看到了这个,它似乎并没有工作
在Django中,我将SESSION_COOKIE_DOMAIN设置为我的域名.但我实际上想用两个不同的域名运行同一个站点.
设置SESSION_COOKIE_DOMAIN后,只有指定的域允许用户登录.是否可以允许两个域登录?
也许这是完全正常的行为,但我觉得这个django_session表比它应该的大得多.
首先,我每天运行以下清理命令,因此大小不是由过期的会话引起的:
DELETE FROM %s WHERE expire_date < NOW()
Run Code Online (Sandbox Code Playgroud)
数字:
SESSION_COOKIE_AGE被设置为默认,2周所以,我猜测Django还会为访问该网站的所有机器人生成会话密钥,并且机器人不会存储cookie,因此它会不断生成新的cookie.
但是......这是正常行为吗?是否有一个设置,以便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设置,你仍然可以设置会话对象.所以我可以想到一些黑客来完成这项工作,例如:
但我想要一个更好的解决方案,我可以忍受.这个问题是否有任何普遍使用或良好的解决方案?或者我甚至在我的模型中正确引用会话?
谢谢您的帮助.
我使用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
我试图清除所有会话变量但不注销当前用户.
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部署每晚都会检查哪些活动用户仍然可以在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)
但如果他们仍然登录,则此会话仍然有效.我们怎样才能立即使它们无效?会话中间件的所有设置都是默认值.
我正在使用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,那也会很好.)
谢谢您的帮助 :-)
我遇到了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?
请任何人都可以打电话给我,有办法检查吗?
先感谢您.