如果我在提交后从页面登录创建新用户,如果一切正常,我会使用 login(request,user)
自动登录并在主页中重新重定向用户。在这种情况下,脚本有效。但是,如果我注销并随后登录,authenticate()
返回 None
并且身份验证失败。
models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
pass
class Email(models.Model):
user = models.ForeignKey("User", on_delete=models.CASCADE, related_name="emails")
sender = models.ForeignKey("User", on_delete=models.PROTECT, related_name="emails_sent")
recipients = models.ManyToManyField("User", related_name="emails_received")
subject = models.CharField(max_length=255)
body = models.TextField(blank=True)
timestamp = models.DateTimeField(auto_now_add=True)
read = models.BooleanField(default=False)
archived = models.BooleanField(default=False)
def serialize(self):
return {
"id": self.id,
"sender": self.sender.email,
"recipients": [user.email for user in self.recipients.all()],
"subject": self.subject,
"body": self.body,
"timestamp": self.timestamp.strftime("%b %d %Y, %I:%M %p"),
"read": self.read,
"archived": self.archived
}
注册视图
def register(request):
if request.method == "POST":
email = request.POST["email"]
# Ensure password matches confirmation
password = request.POST["password"]
confirmation = request.POST["confirmation"]
if password != confirmation:
return render(request, "mail/register.html", {
"message": "Passwords must match."
})
# Attempt to create new user
try:
user = User.objects.create_user(email, email, password)
user.save()
except IntegrityError as e:
print(e)
return render(request, "mail/register.html", {
"message": "Email address already taken."
})
login(request, user)
return HttpResponseRedirect(reverse("index"))
else:
return render(request, "mail/register.html")
登录视图
import json
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.db import IntegrityError
from django.http import JsonResponse
from django.shortcuts import HttpResponse, HttpResponseRedirect, render
from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt
from .models import User, Email
def login_view(request):
if request.method == "POST":
# Attempt to sign user in
email = request.POST["email"]
password = request.POST["password"]
user = authenticate(request, user=email, password=password)
# Check if authentication successful
if user is not None:
login(request, user)
return HttpResponseRedirect(reverse("index"))
else:
return render(request, "mail/login.html", {
"message": "Invalid email and/or password"})
else:
return render(request, "mail/login.html")