代码如下:
- setting 邮箱设置
# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-f73ic!bpf2!skw5=zlp@@0y85@r)rjbjb_h$*-y4^)*y8&8_)v' # 邮箱配置 # 邮箱的smtp服务器,SMTP就是简单邮箱传输协议基本邮箱都会提供该服务, EMAIL_HOST = 'smtp.163.com' # smtp服务器的端口号 EMAIL_PORT = 25 # 该参数填写的是你的邮箱 EMAIL_HOST_USER = 'xxx@163.com' # 该参数填写的不是你的邮箱登陆密码,而是在开启SMTP服务的时候,会填写一个密码,使用的是该密码 EMAIL_HOST_PASSWORD = 'xxxxxxx' # 该参数是否使用安全传输协议,参数默认是False EMAIL_USE_TLS = False # 收邮件人看到的邮箱地址 EMAIL_FROM = 'david<xxxx@163.com>'
- urls.py 路由设置
from django.urls import path from App06 import views app_name = 'App06' urlpatterns = [ # 邮箱验证 path('check/',views.check_email,name='check'), path('active/<token>/',views.check_active,name='active'), ]
- models.py 导入
from django.db import models class TUser(models.Model): id = models.BigAutoField(primary_key=True) password = models.CharField(max_length=128) last_login = models.DateTimeField(blank=True, null=True) is_superuser = models.IntegerField() username = models.CharField(unique=True, max_length=150) first_name = models.CharField(max_length=150) last_name = models.CharField(max_length=150) email = models.CharField(max_length=254) is_staff = models.IntegerField() is_active = models.IntegerField() date_joined = models.DateTimeField() class Meta: managed = False db_table = 't_user'
- views.py 代码
def check_email(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 判断用户是否存在 user = TUser.objects.filter(username=username,password=password).first() if user: return HttpResponse('用户已存在!') else: # 创建用户,并把激活状态置False user = TUser.objects.create(username=username,password=password,is_active=False) # 生成token token = token_confirm.generate_validate_token(user.id) print(token) # 激活的url地址 url = 'https://'+request.get_host()+reverse('App06:active',kwargs={'token':token}) print(url) # 加载模板,同时渲染 # return render(request, 'app06/active.html', locals()) html = loader.get_template('app06/active.html').render({'url':url}) # 发送激活邮件 send_mail('账号激活','请激活账号',EMAIL_FROM,['13911596975@139.com'],html_message=html) return HttpResponse('邮件已发送,请登录邮箱激活账号!') return render(request,'app06/register.html') def check_active(request,token): try: id = token_confirm.confirm_validate_tokent(token) except: id = token_confirm.remove_validation_token(token) user = TUser.objects.get(pk=id) if user: user.delete() return HttpResponse('注册失败,请重新注册!') try: user = TUser.objects.get(pk=id) except TUser.DoesNotExist: return HttpResponse('你激活用户不存在,请注册!') # 激活用户,并保存 user.is_active = True user.save() return HttpResponse('用户已激活,请登录')
- 自定义utils.py 代码。使用setting的
SECRET_KEY 生成token。
import base64 from django.conf.global_settings import SECRET_KEY from itsdangerous import URLSafeSerializer as ustr class Token: def __init__(self,security_key): self.security_key = security_key self.salt = base64.encodebytes(security_key.encode('utf8')) def generate_validate_token(self,username): serializer = ustr(self.security_key) return serializer.dumps(username,self.salt) def confirm_validate_tokent(self,token,expiration=3600): # 默认1小时 serializer = ustr(self.security_key) return serializer.loads(token,salt=self.salt,max_age=expiration) def remove_validation_token(self,token): serializer =ustr(self.security_key) print(serializer.loads(token, salt=self.salt)) return serializer.loads(token, salt=self.salt) # 定义为全局变量 token_confirm = Token(SECRET_KEY)
- 前端html 代码。包括register.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> </head> <body> <form action="{% url 'App06:check' %}" method="post"> {% csrf_token %} 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="提交"> </form> </body> </html>
和active.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>邮箱激活</title> </head> <body> <p2>亲爱的用户:</p2><br> <p3>请点击 <a href="{{ url }}">激活</a> 账号</p3> </body> </html>
参考网上大神的方法,如 停止服务WorldWideWebPublishingService等等,不能解决问题。
看到debug信息:[01/Jan/2024 09:16:15] You're accessing the development server over HTTPS, but it only supports HTTP.
突然灵光一闪。是不是代码:
url = 'https://'+request.get_host()+reverse('App06:active',kwargs={'token':token})
url设置的https有问题呢?
url = 'http://'+request.get_host()+reverse('App06:active',kwargs={'token':token})
把它从 https 变更成 http 后问题解决!