python3 manage.py shell
from django.contrib.sessions.models import Session
# 这里会显示浏览器 cookie 中存储的会话 ID
session = Session.objects.get(session_key="...")
print(session.get_decoded())
# accounts/views.py
def persona_login(request):
user = authenticate(assertion=request.POST["assertion"])
if user is not None:
login(request, user)
return HttpResponse("OK")
# accounts/tests/test_models.py
from django.test import TestCase
from django.contrib.auth import get_user_model
User = get_user_model()
class UserModelTest(TestCase):
def test_user_is_valid_with_email_only(self):
user = User(email="a@b.com")
user.full_clean() # 不该抛出异常
# accounts/models.py
from django.db import models
class User(models.Model):
email = models.EmailField()
# functional_tests/test_login.py
def test_login_with_persona(self):
# Y 访问这个很棒的超级列表网站
# 第一次注意到 "Sign in" 链接
self.browser.get(self.server_url)
self.browser.find_element_by_id('id_login').click()
# 出现一个 Persona 登录框
# 需要辅助函数,它们都用于实现 Selenium 测试中十分常见的操作:等待某件事发生。
self.switch_to_new_window("Mozilla Persona")
# Y 使用她的电子邮件地址登录
## 测试中的电子邮件使用 mockmyid.com
# 可以使用如下方法查找 Persona 电子邮件输入框的 ID:手动打开网站,使用 Firefox 调试工具条(`Ctrl + Shift + I`)
# 这里没有使用真实的电子邮件地址,而是用虚拟工具生成的地址,因此不用在邮件服务供应商的网站上填写认证信息。虚拟工具可以使用 MockMyID 或者 Persona Test User
self.browser.find_element_by_id("authentication_email").send_keys("edith@mockmyid.com")
self.browser.find_element_by_tag_name("button").click()
# Persona 窗口关闭
self.switch_to_new_window("To-Do")
# 她发现自己已经登录
# 需要辅助函数,它们都用于实现 Selenium 测试中十分常见的操作:等待某件事发生。
self.wait_to_be_logged_in()
# 刷新页面,她发现真的通过会话登录了
# 而且并不只在那个页面中有效
self.browser.refresh()
self.wait_to_be_logged_in()
# 对这项新功能有些恐惧,她立马点击了退出按钮
self.browser.find_element_by_id("id_logout").click()
self.wait_to_be_logged_out()
# 刷新后仍旧保持退出状态
self.browser.refresh()
self.wait_to_be_logged_out()
# functional_tests/test_login.py
def wait_for_element_with_id(self, element_id):
WebDriverWait(self.browser, timeout=30).until(
lambda b: b.find_element_by_id(element_id), "Could not find element with id {}. Page text was {}"
.format(element_id, self.browser.find_element_by_tag_name("body").text))