美文网首页零基础使用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