美文网首页djangoDjangoPython学习资料整理
Django+xadmin打造在线考试系统2.0(附代码)

Django+xadmin打造在线考试系统2.0(附代码)

作者: f5065e26181b | 来源:发表于2019-08-27 14:11 被阅读0次

    本期将会介绍用户管理模块和代码开源一些原则。

    一、用户管理模块

    为了对用户更有效的管理,加入新功能,通过邮箱来实现用户注册、激活和密码修改。

    在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件。

    在setting.py中添加:

    EMAIL_HOST = "smtp.163.com" # SMTP服务器主机 EMAIL_PORT = 25 # 端口 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST_USER = "12345678@163.com" # 邮箱地址 EMAIL_HOST_PASSWORD = "********" # 授权码 EMAIL_USE_TLS= True EMAIL_FROM = "12345678@163.com" # 邮箱地址
    

    其中授权码需要在邮箱内进行设计,经过测试QQ邮箱和163邮箱都是可以用的。

    image

    新建一个email_send.py文件,用于存放邮箱发送函数:

    # 生成随机字符串 def random_str(random_length=8):
     str = '' # 生成字符串的可选字符串 chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' length = len(chars) - 1 random = Random()
        for i in range(random_length):
     str += chars[random.randint(0, length)]
        return str
    
    # 发送注册邮件 def send_register_eamil(email, send_type="register"):
        # 发送之前先保存到数据库,到时候查询链接是否存在
        # 实例化一个EmailVerifyRecord对象 email_record = EmailVerifyRecord()
        # 生成随机的code放入链接 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)
    
            # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list 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)
    
            # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list 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)
    
            # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
            # 如果发送成功 if send_status:
                pass
    

    在用户注册后,根据邮箱找到对应的用户,然后设置is_active = True来实现用户激活。

    # 激活用户的view class ActiveUserView(View):
        def get(self, request, active_code):
            # 查询邮箱验证记录是否存在 all_record = EmailVerifyRecord.objects.filter(code = active_code)
    
            if all_record:
                for record in all_record:
                    # 获取到对应的邮箱 email = record.email
                    # 查找到邮箱对应的user user = UserProfile.objects.get(email=email)
     user.is_active = True user.save()
                    # 激活成功跳转到登录页面 return render(request, "login.html", )
            else:
                return render(request, "register.html", {"msg": "您的激活链接无效"})
    
    image

    找回密码和重置密码也同样是向邮箱发链接,确认后修改密码:

    image
    class ForgetPwdView(View):
        '''找回密码''' def get(self,request):
     forget_form = ForgetPwdForm()
            return render(request,'forgetpwd.html',{'forget_form':forget_form})
    
        def post(self,request):
     forget_form = ForgetPwdForm(request.POST)
            if forget_form.is_valid():
     email = request.POST.get('email',None)
     send_register_eamil(email,'forget')
                return render(request, 'send_success.html')
            else:
                return render(request,'forgetpwd.html',{'forget_form':forget_form})
    
    class ResetView(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
                    return render(request, "password_reset.html", {"email":email})
            else:
                return render(request, "active_fail.html")
            return render(request, "login.html")
    
    class ModifyPwdView(View):
        '''修改用户密码''' def post(self, request):
     modify_form = ModifyPwdForm(request.POST)
            if modify_form.is_valid():
     pwd1 = request.POST.get("password1", "")
     pwd2 = request.POST.get("password2", "")
     email = request.POST.get("email", "")
                if pwd1 != pwd2:
                    return render(request, "password_reset.html", {"email":email, "msg":"密码不一致!"})
     user = UserProfile.objects.get(email=email)
     user.password = make_password(pwd2)
     user.save()
    
                return render(request, "login.html")
            else:
     email = request.POST.get("email", "")
                return render(request, "password_reset.html", {"email":email, "modify_form":modify_form })
    

    二、代码开源原则

    2.0系统在1.0基础上有了很大提高,但是不论从功能还是界面美化上都还有很多不足,开源的目的就是为了不断提高,所以在这明确几个开源的原则:

    (1)代码开源在本人GitHub上,公众号回复【在线考试2】获取链接;

    (2)有任何想法、问题可以通过issue进行留言;

    image

    (3)如果有意作为共同开发者维护代码可以在公众号中加管理员微信,申请作为共同开发者。

    (4)此开源代码不能直接用于商业用途。

    关注公众号,获取海量学习资源。

    image

    1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。

    image

    //猜你喜欢//

    相关文章

      网友评论

        本文标题:Django+xadmin打造在线考试系统2.0(附代码)

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