如何防止 Django 覆盖 sessionid cookie?
Posted
技术标签:
【中文标题】如何防止 Django 覆盖 sessionid cookie?【英文标题】:How to prevent Django from overriding sessionid cookie? 【发布时间】:2013-01-31 17:55:48 【问题描述】:我试图让 2 个浏览器窗口在测试中具有相同的会话。请注意,由于 selenium 的限制,每个浏览器都有不同的 firefox 配置文件。
测试(你可以试试,只要你有测试/测试人员用户)是:
import time
from django.test import LiveServerTestCase
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.firefox.webdriver import WebDriver
from selenium.common.exceptions import NoSuchElementException
class ScriptTestCase(LiveServerTestCase):
def do_admin_login(self, username, password, browser):
browser.get('%s%s' % (self.live_server_url, '/admin/'))
username_input = browser.find_element_by_name("username")
username_input.send_keys(username)
password_input = browser.find_element_by_name("password")
password_input.send_keys(password)
browser.find_element_by_xpath('//input[@value="Log in"]').click()
def test_double_window_inactivity(self):
browser0 = WebDriver()
self.do_admin_login('test', 'test', browser0)
cookie = browser0.get_cookie('sessionid')
cookies = 'name': 'sessionid', 'value': cookie['value']
browser1 = WebDriver()
browser1.add_cookie(cookies)
print 1, browser0.get_cookie('sessionid')['value']
print 2, browser1.get_cookie('sessionid')['value']
browser1.get('%s%s' % (self.live_server_url, '/admin/'))
print 3, browser0.get_cookie('sessionid')['value']
print 4, browser1.get_cookie('sessionid')['value']
输出是:
1 08ba4efecf00d2b98aacd174ed20e144
2 08ba4efecf00d2b98aacd174ed20e144
3 08ba4efecf00d2b98aacd174ed20e144
4 cb49379190cb37735697c5c82ab300fc
如您所见,在 browser1 打开 /admin/ 后,它的 sessionid 被意外覆盖。
如何解决这个问题?我正在尝试让 browser1 与 browser0 具有相同的会话。
修复了代码,感谢 Hedde ---
def test_double_window_inactivity(self):
self.browser.execute_script('window.open("/admin/", "other")')
for win in self.browser.window_handles:
self.browser.switch_to_window(win)
self.assertWarningHidden()
time.sleep(5+1) # Added one second to compensate for fadeIn
for win in self.browser.window_handles:
self.browser.switch_to_window(win)
self.assertWarningShown()
time.sleep(5+1) # Added one second to compensate for lag
for win in self.browser.window_handles:
self.browser.switch_to_window(win)
self.assertWarningNotInPage()
【问题讨论】:
【参考方案1】:我相信事情会按预期进行。也就是说,会话应该跨标签和/或窗口共享,而不是跨浏览器。
查看您的代码,您似乎不打算跨浏览器共享会话,只是跨两个 Firefox 窗口。实例化两个 WebDriver 类不是你应该的工作方式。
看看 selenium source code,firefox.WebDriver
继承自 remote.WebDriver
,它具有切换选项卡和/或窗口的方法(例如第 490 行)。
您应该将浏览器设置为类变量并相应地打开窗口或选项卡。
【讨论】:
以上是关于如何防止 Django 覆盖 sessionid cookie?的主要内容,如果未能解决你的问题,请参考以下文章
防止 Django SQLite db 在推送到 Heroku 时被覆盖
Django:如何在不使用 SESSION_SAVE_EVERY_REQUEST 的情况下为 AnonymousUser 设置 sessionid cookie