django 学习邮箱注册激活。发现127.0.0.1 发送了无效的响应 问题解决。

代码如下:

  1. 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>'
  2. 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'),
    ]

  3. 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'

  4. 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('用户已激活,请登录')

  5. 自定义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)

  6. 前端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>

    参考网上大神的方法,如 停止服务W‎orldWideWebPubli‎shingServi‎ce等等,不能解决问题。

看到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 后问题解决!

 

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值