13. 用户注册及邮件发送

前端页面中的跳转链接可以写成 href="{% url 'index' %}" 格式,而不是 herf="index.html"

用户注册

  1. 注册的view
# _*_ coding: utf-8 _*_
from django.shortcuts import render
from django.views.generic.base import View
from django.contrib.auth.hashers import make_password

from users.forms import LoginForm, RegisterForm
from users.models import UserProfile
from utils.email_send import send_register_email
# 注册
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 render(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)
            user_profile.save()

            send_register_email(user_name, "register")
            return render(request, "login.html")
        else:
            return render(request, "register.html", {"register_form": register_form})
  1. 注册的from
# _*_ coding: utf-8 _*_
from django import forms
from captcha.fields import CaptchaField
# 注册form
class RegisterForm(forms.Form):
    email = forms.EmailField(required=True)
    password = forms.CharField(required=True, min_length=5)
    captcha = CaptchaField(error_messages={"invalid": u"验证码错误"})
  1. 用户数据表
# _*_ coding: utf-8 _*_
from __future__ import unicode_literals
from datetime import datetime

from django.db import models
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
    nike_name = models.CharField(max_length=10, verbose_name="昵称", default="")
    birday = models.DateField(verbose_name="生日", null=True, blank=True)
    gender = models.CharField(choices=(("male", u"男"), ("female", u"女")), default="male", max_length=6)
    adress = models.CharField(max_length=100, default=u"", verbose_name=u"地址")
    moblie = models.CharField(max_length=11, null=True, blank=True, verbose_name=u"手机")
    image = models.ImageField(upload_to="upload/iamge/%Y/%m", default=u"image/defult.png", max_length=100)

    class Meta:
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.username
  1. 注册的url
url('^register/$', User_Views.RegisterView.as_view(),  name="register"),

邮件相关

  1. 邮件发送
  • 新建一个utils目录用来存放工具相关函数
  • 在utils目录下新建email_send.py文件
# _*_ coding: utf-8 _*_
__author__ = 'daxiahy'
__date__ = '2019/1/3 18:04'

from random import Random
from django.core.mail import send_mail

from users.models import EmailVerifyRecord
from mxonline.settings import EMAIL_FROM


def random_str(randomlength=8):
    str = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars) - 1
    random = Random()
    for i in range(randomlength):
        str+=chars[random.randint(0, length)]
    return str


def send_register_email(email, send_type="register"):
    email_record = EmailVerifyRecord()
    if send_type == "update_email":
        code = random_str(4)
    else:
        code = random_str(16)
    email_record.code = code
    email_record.email = email
    email_record.send_type = send_type
    email_record.save()

    email_title = ""
    email_body = ""

    if send_type == "register":
        email_title = "慕学在线网注册激活链接"
        email_body = "请点击下面的链接激活你的账号: http://127.0.0.1:8000/active/{0}".format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass
    elif send_type == "forget":
        email_title = "慕学在线网注册密码重置链接"
        email_body = "请点击下面的链接重置密码: http://127.0.0.1:8000/reset/{0}".format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass
    elif send_type == "update_email":
        email_title = "慕学在线邮箱修改验证码"
        email_body = "你的邮箱验证码为: {0}".format(code)

        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        if send_status:
            pass

邮件在setting中的配置

EMAIL_HOST = "smtp.mxhichina.com"
EMAIL_PORT = "25"
EMAIL_HOST_USER = "tarimbbs@tarimbbs.cn"
EMAIL_HOST_PASSWORD = ""
EMAIL_HOST_TLS = False
EMAIL_FROM = "tarimbbs@tarimbbs.cn"
EMAIL_HOST = "smtp.163.com"
EMAIL_PORT = "25"
EMAIL_HOST_USER = "passion2048@163.com"
EMAIL_HOST_PASSWORD = ""
EMAIL_HOST_TLS = False
EMAIL_FROM = "passion2048@163.com"
  1. 前端页面html
<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>register</title>
</head>
<body>
<div class="fl form-box">
                <div class="tab">
                    <!--<h2 class="active">手机注册</h2>-->
                    <h2>邮箱注册</h2>
                </div>

                <div class="tab-form">
                    <form id="email_register_form" method="post" action="{% url 'register' %}" autocomplete="off">
                        {% csrf_token %}
                        <div class="form-group marb20 {% if register_form.errors.email %}errorput{% endif %}">
                            <label>邮     箱</label>
                            <input  type="text" id="id_email" name="email" value="{{ register_form.email.value|default_if_none:''  }}" placeholder="请输入您的邮箱地址" />
                        </div>
                        <div class="form-group marb8 {% if register_form.errors.password %}errorput{% endif %}">
                            <label>密     码</label>
                            <input type="password" id="id_password" name="password"  value="{{ register_form.password.value|default_if_none:''  }}" placeholder="请输入6-20位非中文字符密码" />
                        </div>
                        <div class="form-group marb8 captcha1 {% if register_form.errors.captcha %}errorput{% endif %}">
                            <label>验 证 码</label>
                            {{ register_form.captcha }}
                        </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>
                </div>
                <p class="form-p">已有账号?<a href="{% url 'login' %}">[立即登录]</a></p>
            </div>
<script src="{% static 'js/jquery-3.3.1.min.js' %}"></script>
<script>
    $('.captcha').click(function () {
    $.getJSON("/captcha/refresh/", function (result) {
        $('.captcha').attr('src', result['image_url']);
        $('#id_captcha_0').val(result['key'])
    });
});

</script>
</body>
</html>
  1. 用户激活
# 激活链接
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")

    def post(self, request):
        return render(request, "login.html")

emile的model

class EmailVerifyRecord(models.Model):
    code = models.CharField(max_length=20, verbose_name=u"验证码")
    email = models.EmailField(max_length=50, verbose_name=u"邮箱")
    send_type = models.CharField(max_length=20, verbose_name=u"类型", choices=(("register", u"注册"), ("forget", u"找回密码")))
    # 需要把datetime.now()的括号去掉才会在实例化类时获取时间,而不是程序编译时
    send_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")

    class Meta:
        verbose_name = u"邮箱验证码"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return '{0}({1})'.format(self.code, self.email)

url配置

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

前端静态目录可以写成 href="{% static 'css/login.css' %}"  格式,且要在html顶端写{% load staticfiles %}