Django项目实战 - user注册功能 - 邮箱激活

Django邮件发送功能官方文档

注册功能流程

 


 

注册功能逻辑

1.from django.core.mail import send_mail    #Django自带邮件发送函数

2.from django.contrib.auth.hashers import make_password    #Django自带hash密码生成函数 (应为在Django的数据表中,密码都是以hash值进行存储)

 

第一步:settings.py中email的变量配置

EMAIL_HOST = "smtp.163.com"
EMAIL_PORT = 25
EMAIL_HOST_USER = "djangoTTT@163.com"
EMAIL_HOST_PASSWORD = "123456a!"
EMAIL_USE_TLS = False
EMAIL_FROM = "djangoTTT@163.com"

 

第二步:配置email_send.py

在app目录下创建utils package创建email_send.py

# -*- coding:utf-8 -*-

from users.models import EmailVerifyRecord
from random import Random
from django.core.mail import send_mail
from mxonline.settings import EMAIL_FROM  # 导入settings.py中配置好的发件人


def random_str(randomlength=8):
    '''
    生成随机验证码
    :param randomlength: 验证码长度
    :return: 
    '''
    ran_str = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars) - 1
    random = Random()
    for i in range(randomlength):
        ran_str +=chars[random.randint(0, length)]
    return ran_str


def send_register_email(email, send_type="register"):
    '''
    发送邮件功能
    :param email: 收件人地址
    :param send_type: 发送类型为 注册或找回密码
    :return: 
    '''
    email_record = EmailVerifyRecord()
    code = random_str(16)
    email_record.code = code
    email_record.email = email
    email_record.send_type = send_type
    email_record.save()    # 将验证码 邮件地址 发送类型 保存到EmailVerifyRecord数据表中

    email_title = ""
    email_body = ""

    if send_type == "register":
        email_title = "图书管理系统注册激活链接"
        email_body = "请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code)

        send_mail(email_title, email_body, EMAIL_FROM, [email])  #调用Django自带的邮件发送函数

 

第三步:在views.py中实现RegisterView用户注册类

class RegisterView(View):
    '''
    实现用户注册功能
    '''
    def get(self, request):
        register_form = RegisterForm()
        return render(request, "register.html", {"register_form": register_form})

    def post(self, request):
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            user_name = request.POST.get("email", "")
       if UserProfile.objects.filter(email=user_name):
          return rander(request, "register.html", {"register_form": register_form, "msg":"用户已存在!"}) pass_word
= request.POST.get("password", "") user_profile = UserProfile() user_profile.username = user_name user_profile.email = user_name
          user_profile.is_active = False # 设置账户为未激活状态 user_profile.password
= make_password(pass_word)    # 使用Django自带hash密码生成函数 user_profile.save()    # 将创建的用户保存到UserProfile表中 send_register_email(user_name, "register")    # 调用邮件发送功能 return render(request, "login.html") else: return render(request, "register.html", {"register_form": register_form})

 

第四步: html配置

注意 value = 值回填函数

errorput 是调用Form类来返回错误值

<form id="email_register_form" method="post" action="{% url "register" %}" autocomplete="off">
    <div class="form-group marb20 {% if register_form.errors.email %}errorput{% endif %}">
        <label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
        <input  type="text" id="id_email" name="email" value="{{ register_form.email.value }}" placeholder="请输入您的邮箱地址" />
    </div>
    <div class="form-group marb8 {% if register_form.errors.password %}errorput{% endif %}">
        <label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
        <input type="password" id="id_password" name="password"  value="{{ register_form.password.value }}" placeholder="请输入6-20位非中文字符密码" />
    </div>
    <div class="form-group marb8 captcha1 {% if register_form.errors.captcha %}errorput{% endif %}">
        <label>&nbsp;&nbsp;</label>
        {{ register_form.captcha }}
       <!-- <img src="/captcha/image/2f3f82e5f7a054bf5caa93b9b0bb6cc308fb7011/" alt="captcha" class="captcha" /> <input id="id_captcha_0" name="captcha_0" type="hidden" value="2f3f82e5f7a054bf5caa93b9b0bb6cc308fb7011" /> <input autocomplete="off" id="id_captcha_1" name="captcha_1" type="text" /> -->
    </div>
    <div class="error btns" id="jsEmailTips" >{% for key,error in register_form.errors.items %}{{ error }}{% endfor %}{{ msg }}</div>
    <div class="auto-box marb8">
    </div>
    <input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册并登录" />
{% csrf_token %}
</form>

 

激活功能逻辑

编写激活类 ActiveUserView

 

class ActiveUserView(View):
    """
    验证注册码,并激活用户
    """

    def get(self, request, active_code):
        all_records = EmailVerifyRecord.objects.filter(code=active_code)
        if all_records:
            for record in all_records:
                email = record.email
                user = UserProfile.objects.get(email=email)
                user.is_active = True
                user.save()
        else:
            return render(request, "active_fail.html")
        return render(request, "login.html")

 

 

 

 

编写激活url

url(r'^active/(?P<active_code>.*)/$', ActiveUserView.as_view(), name="user_active")

 

登录逻辑也需要对是否激活进行判断

class LoginView(View):
    """
    登录验证
    """
    def get(self, request):
        return render(request, "login.html", {})

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
            user = authenticate(username=user_name, password=pass_word)
            if user:
                if user.is_active:
                    login(request, user)
                    return render(request, "index.html")
                else:
                    return render(request, "login.html", {"msg": u"用户还未激活!"})
            else:
                return render(request, "login.html", {"login_form": login_form, "msg": u"用户名或密码错误!"})
        else:
            return render(request, "login.html", {"login_form": login_form})

 

posted @ 2017-03-02 01:27  Vincen_shen  阅读(857)  评论(0)    收藏  举报