美文网首页零基础使用Django2.0.1打造在线教育网站
零基础使用Django2.0.1打造在线教育网站(十三):邮箱验

零基础使用Django2.0.1打造在线教育网站(十三):邮箱验

作者: 啃饼小白 | 来源:发表于2018-08-04 08:09 被阅读40次

写在前面

本篇笔记主要解决用户注册,验证码的实现,邮箱验证码的发送这3个问题。

本篇笔记对应于第十三篇代码,对应于github的位置是https://github.com/licheetools/eduline

用户注册的实现

首先把我们的前端注册页面拷贝到我们的templates文件夹里面:

然后,书写我们的注册视图函数,打开users/views.py,在里面添加如下代码:

# 用于实现用户注册的函数
class RegisterView(View):
    # get方法直接返回页面
    def get(self, request):
        return render(request, "register.html", {})

接着配置路径,在eduline/urls.py文件里面,添加如下代码:

from users.views import  RegisterView

path('register/', RegisterView.as_view(), name="register")

继续在index.html文件配置页面的跳转信息:

顺便把我们的登录链接也给修改一下。

静态文件中static目录的引用配置

现在我们需要对静态文件中static目录的引用进行配置,分2个步骤:
1、对HTML页面内含有"/static/media/image/2016/12/default_big_14.png"这种格式的img,js,css ,images都需要在<html>标签内加上{% load staticfiles %}这个代码;
2、将所有链接中的"/static/css/style.css"绝对路径格式修改为相对路径格式:
"{% static 'css/style.css' %}",记住保留static文件的下一级文件(路径我们之前在settings.py文件配置过STATIC_URL = '/static/'),其他的类似,这里不细说了。
大家需要将目前接触到的****,****,****这三个文件里的所有绝对路径格式修改为相对路径格式,尽管比较多而且枯燥,但是希望大家坚持克服一下。

最后运行一下我们的项目,看样式是不是都正确加载出来了!

验证码的实现

有时候为了辨别是不是机器人或者其他登录,网站都采用输入验证码的方式来进行识别,这是一个非常行之有效的方法。
1、下载安装captcha:

C:\Users\YC>F:

F:\>cd Envs

F:\Envs>workon eduline
(eduline) F:\Envs>cd eduline

(eduline) F:\Envs\eduline>pip install  django-simple-captcha==0.5.9 -i https://pypi.tuna.tsinghua.edu.cn/simple

django-simple-captcha==0.5.9或者以上版本!
或者本地安装下载链接地址:django-simple-captcha
2、打开settings.py文件,把 captcha 增加到 INSTALLED_APPS 里面去:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users',
    'courses',
    'organization',
    'operation',
    'xadmin',
    'crispy_forms',
    'captcha'
]

3、配置Path,打开eduline/urls.py文件,在里面添加:

from django.urls import  include

# 验证码url
path("captcha/", include('captcha.urls'))

4、数据库生产和迁移操作:

makemigrations
migrate

打开Navicat,查看我们生成的数据表:

5、将验证码在前端页面展示
打开users/forms.py文件,在里面添加如下代码:

from captcha.fields import CaptchaField   # 引入验证码field

# 用户登录表单时验证码的验证,注意字段与前端页面保持一致
class RegisterForm(forms.Form):
    email = forms.CharField(required=True)  # 用户名不能为空
    password = forms.CharField(required=True, min_length=5)  # 密码不能为空,而且最小5位数
    captcha = CaptchaField()

6、删除一行代码:



7、实例化注册视图函数
打开users/views.py文件,在里面修改并输入以下代码:

from users.forms import RegisterForm


# 用于实现用户注册的函数
class RegisterView(View):
    # get方法直接返回页面
    def get(self, request):
        register_form = RegisterForm()
        return render(request, "register.html", {"register_form": register_form})

8、修改前端页面代码
之前:

 <div class="form-group marb8 captcha1 ">
          <label>验&nbsp;证&nbsp;码</label>
 </div>

现在:

<div class="form-group marb8 captcha1 ">
              <label>验&nbsp;证&nbsp;码</label>
             {{ register_form.captcha }}
</div>

还有url的跳转问题,注意外面有双引号,里面就只能用单引号了:

尽管我们前面把前端显示的输入框那行代码给删除了,现在只有label,但是前端页面依旧可以查看到输入框,那是因为Registerform会为我们自动生成输入框和验证码,怎么样是不是很神奇!而且这其中隐藏的字符串的框会被带到后台,由Django为我们进行验证,用于验证该验证码是否保存过,已经存在就换一个,不存在就可以使用!顺便在</form>标签之前加上{% csrf_token %}

9、RegisterView的完善
打开users/views.py文件,在里面修改并输入以下代码:

# 用于实现用户注册的函数
class RegisterView(View):
    # get方法直接返回页面
    def get(self, request):
        register_form = RegisterForm()
        return render(request, "register.html", {"register_form": register_form})

    def post(self, request):
# 类的实例化需要一个字典dict参数,而前面我们就知道request.POST是一个QueryDict,所以可以直接传入POST中的信息
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            pass

验证码的刷新是前端页面完成的,就是下面一段代码:

//刷新验证码的代码,是JQuery控制的,前端代码已经有了,这里了解一下即可。
function refresh_captcha(event){
    $.get("/captcha/refresh/?"+Math.random(), function(result){
        $('#'+event.data.form_id+' .captcha').attr("src",result.image_url);
        $('#id_captcha_0').attr("value",result.key);
    });
    return false;
}

10、运行一下我们的项目,发现验证码可以刷新,没有问题!

11、但是如果我们输入错误的验证码,页面没有提示错误信息,所以我们还是需要配置我们的forms.py文件,添加修改一行代码:

captcha = CaptchaField(error_messages={"invalid": "验证码错误"})

现在验证码的错误信息就会显示出来了!

至此,验证码就先到这里,后面会继续完善这个功能。

邮箱验证码的发送与接收

新浪邮箱发送验证码

我们这里不使用Python自己的邮件发送功能,而是直接利用第三方的服务器来发送:
1、打开eduline/settings.py文件,在其中添加如下代码:

# 发送邮箱验证的配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sina.cn'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'licheetools@sina.cn'   #EMAIL_HOST_USER和EMAIL_FROM必须一样,否则会出错,而且必须是sina邮箱
EMAIL_HOST_PASSWORD = ""
EMAIL_USE_TLS = False
EMAIL_FROM = 'licheetools@sina.cn'

2、在users应用里面新建一个名为utils的package包,再在这个utils里面新建email_send.py文件,里面输入以下代码:

from random import Random

from users.models import EmailVerifyRecord
from django.core.mail import send_mail         # 导入Django自带的邮件模块
from eduline.settings import EMAIL_FROM       # 导入setting中发送邮件的配置


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()  # 实例化一个EmailVerifyRecord对象
    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)
        # 使用Django内置的函数来完成邮件的发送,包括四个参数:主题,邮件内容,从哪里发,接收者list
        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        # 如果发送成功
        if send_status:
            pass

顺便完善一下你的注册函数,修改为如下:

from users.forms import LoginForm, RegisterForm
from django.contrib.auth.hashers import make_password
from users.utils.email_send import send_register_eamil


# 用于实现用户注册的函数
class RegisterView(View):
    # get方法直接返回页面
    def get(self, request):
        register_form = RegisterForm()
        return render(request, "register.html", {'register_form': register_form})

    def post(self, request):
        # 类的实例化需要一个字典dict参数,而前面我们就知道request.POST是一个QueryDict,所以可以直接传入POST中的信息
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            # username,password为前端页面name的返回值,取到用户名和密码我们就开始进行登录验证;取不到时为空。
            user_name = request.POST.get("email", "")
            pass_word = request.POST.get("password", "")
            # 实例化一个user_profile对象,存入前端页面获取的值
            user_profile = UserProfile()
            user_profile.username = user_name
            user_profile.email = user_name

            # 对password进行加密并保存
            user_profile.password = make_password(pass_word)
            user_profile.save()
            send_register_eamil(user_name, 'register')
            pass

3、登录你的新浪邮箱,点击右上角的设置,然后选择左边的客户端setp,开启服务即可:



4、在图示代码处打上断点,开启测试模式:

5、运行项目,开启Debug模式,在这之前先看一下我们的用户信息表:
我们注册继续使用刚才的邮箱:licheetools@sina.cn
现在开始调试代码:
打开数据库里的用户信息表,发现刚才的注册用户已经存进来了:
继续按单步调试按钮,页面跳转到发送邮件的py文件了:
现在我们去新浪邮箱里看看:
邮件发送成功了!!!

QQ邮箱验证码的发送

需要修改上面的2步,其他的不用变化。打开eduline/settings.py文件,在其中修改为如下代码:

# 发送邮箱验证的配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = '2131247535@qq.com'
EMAIL_HOST_PASSWORD = ''  #这里填写授权码
EMAIL_USE_TLS= False
EMAIL_FROM = '2131247535@qq.com'

在users应用里面新建一个名为utils的package包,再在这个utils里面新建email_send.py文件,里面输入以下代码:

from random import Random

from users.models import EmailVerifyRecord
from django.core.mail import send_mail         # 导入Django自带的邮件模块
from eduline.settings import EMAIL_FROM       # 导入setting中发送邮件的配置


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()  # 实例化一个EmailVerifyRecord对象
    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)
        # 使用Django内置的函数来完成邮件的发送,包括四个参数:主题,邮件内容,从哪里发,接收者list
        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
        # 如果发送成功
        if send_status:
            pass
然后登录你的QQ邮箱,点击设置---> 账户,找到如下:
开启QQ的smtp服务,接着点击生成授权码,按照提示发送短信:

接着打开users/views.py文件,完善def post(self, request):函数,就是这个样子:
顺便完善一下你的注册函数,修改为如下:

from users.forms import LoginForm, RegisterForm
from django.contrib.auth.hashers import make_password
from users.utils.email_send import send_register_eamil


# 用于实现用户注册的函数
class RegisterView(View):
    # get方法直接返回页面
    def get(self, request):
        register_form = RegisterForm()
        return render(request, "register.html", {'register_form': register_form})

    def post(self, request):
        # 类的实例化需要一个字典dict参数,而前面我们就知道request.POST是一个QueryDict,所以可以直接传入POST中的信息
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            # username,password为前端页面name的返回值,取到用户名和密码我们就开始进行登录验证;取不到时为空。
            user_name = request.POST.get("email", "")
            pass_word = request.POST.get("password", "")
            # 实例化一个user_profile对象,存入前端页面获取的值
            user_profile = UserProfile()
            user_profile.username = user_name
            user_profile.email = user_name

            # 对password进行加密并保存
            user_profile.password = make_password(pass_word)
            user_profile.save()
            send_register_eamil(user_name, 'register')
            pass

然后就是继续刚才的调试了,断点代码的位置一模一样,这里就不细说了,按照要求是不会出问题的。

接下来我们继续完善我们的错误信息提示,可以照葫芦画瓢对着前面在login页面的设置,把它们搬到register页面中来。

错误信息的完善

这是我们前面在login页面的配置:
尝试一下在register页面也做类似的配置:

然后我们还要完善一下用户的信息回填操作,无论是否有错都要这么做,我们采用这行代码来完成要求:

value="{% ifnotequal None register_form.email.value %}{{ register_form.email.value }}{% endifnotequal %}"

我们是以邮箱来说明的,{{ register_form.email.value }}是返回邮箱的值,{% ifnotequal None register_form.email.value %}是说如果email的值不为空,则等于返回的值,为空就显示None。如果你不能理解其实就是这个意思:

value="{% if None != register_form.email.value %}{{ register_form.email.value }}{% endifnotequal %}"

你可以参考这篇文章用于加深你的理解:Django比较相等或者不相等的模板语法ifequal / ifnotequal
还有这篇django学习——模板中判断相等与否的两种用法ifequal与if
我们试着对密码做同样的操作:

value="{% if None != register_form.password.value %}{{ register_form.password.value }}{% endif %}"
运行一下我们的项目:

看到没,提示信息已经出现了!

至此,本篇关于用户注册,验证码的实现,邮箱验证码的发送这3个问题的介绍就到此结束了,下一篇我们将实现用户的激活,用户密码找回等功能的实现,感谢你的赏阅。

本篇笔记对应于第十三篇代码,对应于github的位置是https://github.com/licheetools/eduline

相关文章

网友评论

    本文标题:零基础使用Django2.0.1打造在线教育网站(十三):邮箱验

    本文链接:https://www.haomeiwen.com/subject/jjjfvftx.html