在注册之前需要配置url
把注册的html页面拷贝到templates下面
然后在urls中做register的配置
C:\Users\hlg\PycharmProjects\MxOnline\templates\register.html
<!DOCTYPE html>
<html>
{% load staticfiles %}
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
<title>慕学在线注册</title>
{# <link rel="stylesheet" type="text/css" href="../css/reset.css">#}
{# <link rel="stylesheet" type="text/css" href="../css/login.css">#}
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/login.css' %}">
</head>
<body>
<div class="loginbox dialogbox">
<h1>账号登录</h1>
<div class="close jsCloseDialog"><img src="../images/dig_close.png"/></div>
<div class="cont">
<form id="jsLoginForm" autocomplete="off">
<div class="box">
<span class="word3">用户名</span>
<input type="text" name="account_l" id="account_l" placeholder="手机号/邮箱" />
</div>
<div class="box">
<span class="word2">密 码</span>
<input type="password" name="password_l" id="password_l" placeholder="请输入您的密码"/>
</div>
<div class="error btns login-form-tips" id="jsLoginTips"></div> <!--登录错误提示-->
<div class="btns">
<span><input type="checkbox" id="jsAutoLogin" /> 自动登录</span>
<span class="forget btn fr">忘记密码</span>
</div>
<div class="button">
<input type="button" value="登录" id="jsLoginBtn" />
</div>
<div class="btns">
<span class="fr">没有账号?<span class="regist btn">立即注册</span></span>
</div>
</form>
</div>
</div>
<div class="dialog" id="jsDialog">
<!--提示弹出框-->
<div class="successbox dialogbox" id="jsSuccessTips">
<h1>成功提交</h1>
<div class="close jsCloseDialog"><img src="../images/dig_close.png"/></div>
<div class="cont">
<h2>您的需求提交成功!</h2>
<p></p>
</div>
</div>
<div class="noactivebox dialogbox" id="jsUnactiveForm" >
<h1>邮件验证提示</h1>
<div class="close jsCloseDialog"><img src="../images/dig_close.png"/></div>
<div class="center">
<img src="../images/send.png"/>
<p>我们已经向您的邮箱<span class="green" id="jsEmailToActive">12@13.com</span>发送了邮件,<br/>为保证您的账号安全,请及时验证邮箱</p>
<p class="a"><a class="btn" id="jsGoToEmail" target="_blank" href="http://mail.qq.com">去邮箱验证</a></p>
<p class="zy_success upmove"></p>
<p style="display: none;" class="sendE2">没收到,您可以查看您的垃圾邮件和被过滤邮件,也可以再次发送验证邮件(<span class="c5c">60s</span>)</p>
<p class="sendE">没收到,您可以查看您的垃圾邮件和被过滤邮件,<br/>也可以<span class="c5c green" id="jsSenEmailAgin" style="cursor: pointer;">再次发送验证邮件</span></p>
</div>
</div>
</div>
<div class="bg" id="dialogBg"></div>
<header>
<div class="c-box fff-box">
<div class="wp header-box">
<p class="fl hd-tips">慕学在线,在线学习平台!</p>
<ul class="fr hd-bar">
<li>服务电话:<span>4001008031</span></li>
<li><a href="login.html">[登录]</a></li>
<li class="active"><a href="register.html">[注册]</a></li>
</ul>
</div>
</div>
</header>
<section>
<div class="c-box bg-box">
<div class="login-box clearfix">
<div class="hd-login clearfix">
<a class="index-logo" href="index.html"></a>
<h1>用户注册</h1>
<a class="index-font" href="index.html">回到首页</a>
</div>
<div class="fl slide">
<div class="imgslide">
<ul class="imgs">
<li><a href=""><img width="483" height="472" src="../images/57a801860001c34b12000460.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="../images/57a801860001c34b12000460.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="../images/57a801860001c34b12000460.jpg" /></a></li>
</ul>
</div>
<div class="unslider-arrow prev"></div>
<div class="unslider-arrow next"></div>
</div>
<div class="fl form-box">
<div class="tab">
<!--<h2 class="active">手机注册</h2>-->
<h2>邮箱注册</h2>
</div>
<!--<div class="tab-form">-->
<!--<form id="mobile_register_form" autocomplete="off">-->
<!--<input type='hidden' name='csrfmiddlewaretoken' value='gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ' />-->
<!--<div class="form-group marb20">-->
<!--<label>手 机 号</label>-->
<!--<input id="jsRegMobile" name="account" type="text" placeholder="请输入您的手机号码" />-->
<!--</div>-->
<!--<div class="form-group marb20" id="jsRefreshCode">-->
<!--<label>验 证 码</label>-->
<!--<input autocomplete="off" class="form-control-captcha mobile-register-captcha" id="mobile-register-captcha_1" name="captcha_m_1" placeholder="请输入验证码" type="text" /> <input class="form-control-captcha mobile-register-captcha" id="mobile-register-captcha_0" name="captcha_m_0" placeholder="请输入验证码" type="hidden" value="29953bacf7005e8469388b449d97d00d523c1706" /> <img src="/captcha/image/29953bacf7005e8469388b449d97d00d523c1706/" alt="captcha" class="captcha" />-->
<!--</div>-->
<!--<div class="clearfix">-->
<!--<div class="form-group marb8 verify-code">-->
<!--<label>短信验证码</label>-->
<!--<input id="jsPhoneRegCaptcha" name="mobile_code" type="text" placeholder="输入手机验证码" />-->
<!--</div>-->
<!--<input class="verify-code-btn sendcode" id="jsSendCode" value="发送验证码">-->
<!--</div>-->
<!--<div class="form-group marb8">-->
<!--<label>密 码</label>-->
<!--<input id="jsPhoneRegPwd" name="password_m" type="password" placeholder="请输入6-20位非中文字符密码" />-->
<!--</div>-->
<!--<div class="error btns" id="jsMobileTips"></div>-->
<!--<div class="auto-box marb8">-->
<!--</div>-->
<!--<input class="btn btn-green" id="jsMobileRegBtn" type="button" value="注册并登录" />-->
<!--</form>-->
<!--</div>-->
<div class="tab-form">
<form id="email_register_form" method="post" action="register.html" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ' />
<div class="form-group marb20 ">
<label>邮 箱</label>
<input type="text" id="id_email" name="email" value="None" placeholder="请输入您的邮箱地址" />
</div>
<div class="form-group marb8 ">
<label>密 码</label>
<input type="password" id="id_password" name="password" value="None" placeholder="请输入6-20位非中文字符密码" />
</div>
<div class="form-group marb8 captcha1 ">
<label>验 证 码</label>
<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"></div>
<div class="auto-box marb8">
</div>
<input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册并登录" />
<input type='hidden' name='csrfmiddlewaretoken' value='5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy' />
</form>
</div>
<p class="form-p">已有账号?<a href="login.html">[立即登录]</a></p>
</div>
</div>
</div>
</section>
<input id="isLogin" type="hidden" value="False"/>
<script src="{% static 'js/jquery.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/unslider.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/validateDialog.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/login.min.js' %}" type="text/javascript"></script>
</body>
</html>
C:\Users\hlg\PycharmProjects\MxOnline\apps\users\views.py
# _*_ encoding:utf-8 _*_
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend #
from django.db.models import Q # 完成并集
from django.views.generic.base import View #
# Create your views here.
from .models import UserProfile
from .forms import LoginForm
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
# 完成自己的逻辑
try:
# user = UserProfile.objects.get(username=username)
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
# Register+View 说明是一个处理前端请求的View类
class RegisterView(View):
def get(self, request):
return render(request, "register.html", {})
# 基于类
class LoginView(View): # 继承View django的View会自动调用get ,post
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 is not None:
login(request, user) # 这个是系统提供的 login
return render(request, "index.html") # 登录成功,跳转到首页
else:
return render(request, "login.html", {"msg": "用户名或密码错误"}) # 验证失败
else:
return render(request, "login.html", {"login_form":login_form}) # 登录失败,跳转到登录页面
C:\Users\hlg\PycharmProjects\MxOnline\MxOnline\urls.py
现在进入首页,或者浏览器输入http://127.0.0.1:8000/register/
效果图:
下面看一下图片验证码:
进入 https://github.com/ 搜索 django captcha
点进去:
再点击:documentation online
看到:
点击 Installation 告诉我们怎么安装
第一步:安装
pip install django-simple-captcha==0.4.6
第二步:Add captcha
to the INSTALLED_APPS
in your settings.py
第三步:Run python manage.py migrate
在运行之前,需要把
url(r'^captcha/', include('captcha.urls')),
然后:
新生成的表:
新建一个工具类:
向用户发送邮件
向用户发送邮件之前,需要定义好邮件的内容:
下面把整个有关代码贴出来:
C:\Users\hlg\PycharmProjects\MxOnline\templates\register.html
<!DOCTYPE html>
<html>
{% load staticfiles %}
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
<title>慕学在线注册</title>
{# <link rel="stylesheet" type="text/css" href="../css/reset.css">#}
{# <link rel="stylesheet" type="text/css" href="../css/login.css">#}
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/login.css' %}">
</head>
<body>
<div class="loginbox dialogbox">
<h1>账号登录</h1>
<div class="close jsCloseDialog"><img src="../images/dig_close.png"/></div>
<div class="cont">
<form id="jsLoginForm" autocomplete="off">
<div class="box">
<span class="word3">用户名</span>
<input type="text" name="account_l" id="account_l" placeholder="手机号/邮箱" />
</div>
<div class="box">
<span class="word2">密 码</span>
<input type="password" name="password_l" id="password_l" placeholder="请输入您的密码"/>
</div>
<div class="error btns login-form-tips" id="jsLoginTips"></div> <!--登录错误提示-->
<div class="btns">
<span><input type="checkbox" id="jsAutoLogin" /> 自动登录</span>
<span class="forget btn fr">忘记密码</span>
</div>
<div class="button">
<input type="button" value="登录" id="jsLoginBtn" />
</div>
<div class="btns">
<span class="fr">没有账号?<span class="regist btn">立即注册</span></span>
</div>
</form>
</div>
</div>
<div class="dialog" id="jsDialog">
<!--提示弹出框-->
<div class="successbox dialogbox" id="jsSuccessTips">
<h1>成功提交</h1>
<div class="close jsCloseDialog"><img src="../images/dig_close.png"/></div>
<div class="cont">
<h2>您的需求提交成功!</h2>
<p></p>
</div>
</div>
<div class="noactivebox dialogbox" id="jsUnactiveForm" >
<h1>邮件验证提示</h1>
<div class="close jsCloseDialog"><img src="../images/dig_close.png"/></div>
<div class="center">
<img src="../images/send.png"/>
<p>我们已经向您的邮箱<span class="green" id="jsEmailToActive">12@13.com</span>发送了邮件,<br/>为保证您的账号安全,请及时验证邮箱</p>
<p class="a"><a class="btn" id="jsGoToEmail" target="_blank" href="http://mail.qq.com">去邮箱验证</a></p>
<p class="zy_success upmove"></p>
<p style="display: none;" class="sendE2">没收到,您可以查看您的垃圾邮件和被过滤邮件,也可以再次发送验证邮件(<span class="c5c">60s</span>)</p>
<p class="sendE">没收到,您可以查看您的垃圾邮件和被过滤邮件,<br/>也可以<span class="c5c green" id="jsSenEmailAgin" style="cursor: pointer;">再次发送验证邮件</span></p>
</div>
</div>
</div>
<div class="bg" id="dialogBg"></div>
<header>
<div class="c-box fff-box">
<div class="wp header-box">
<p class="fl hd-tips">慕学在线,在线学习平台!</p>
<ul class="fr hd-bar">
<li>服务电话:<span>4001008031</span></li>
<li><a href="login.html">[登录]</a></li>
<li class="active"><a href="register.html">[注册]</a></li>
</ul>
</div>
</div>
</header>
<section>
<div class="c-box bg-box">
<div class="login-box clearfix">
<div class="hd-login clearfix">
<a class="index-logo" href="index.html"></a>
<h1>用户注册</h1>
<a class="index-font" href="index.html">回到首页</a>
</div>
<div class="fl slide">
<div class="imgslide">
<ul class="imgs">
<li><a href=""><img width="483" height="472" src="../images/57a801860001c34b12000460.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="../images/57a801860001c34b12000460.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="../images/57a801860001c34b12000460.jpg" /></a></li>
</ul>
</div>
<div class="unslider-arrow prev"></div>
<div class="unslider-arrow next"></div>
</div>
<div class="fl form-box">
<div class="tab">
<!--<h2 class="active">手机注册</h2>-->
<h2>邮箱注册</h2>
</div>
<!--<div class="tab-form">-->
<!--<form id="mobile_register_form" autocomplete="off">-->
<!--<input type='hidden' name='csrfmiddlewaretoken' value='gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ' />-->
<!--<div class="form-group marb20">-->
<!--<label>手 机 号</label>-->
<!--<input id="jsRegMobile" name="account" type="text" placeholder="请输入您的手机号码" />-->
<!--</div>-->
<!--<div class="form-group marb20" id="jsRefreshCode">-->
<!--<label>验 证 码</label>-->
<!--<input autocomplete="off" class="form-control-captcha mobile-register-captcha" id="mobile-register-captcha_1" name="captcha_m_1" placeholder="请输入验证码" type="text" /> <input class="form-control-captcha mobile-register-captcha" id="mobile-register-captcha_0" name="captcha_m_0" placeholder="请输入验证码" type="hidden" value="29953bacf7005e8469388b449d97d00d523c1706" /> <img src="/captcha/image/29953bacf7005e8469388b449d97d00d523c1706/" alt="captcha" class="captcha" />-->
<!--</div>-->
<!--<div class="clearfix">-->
<!--<div class="form-group marb8 verify-code">-->
<!--<label>短信验证码</label>-->
<!--<input id="jsPhoneRegCaptcha" name="mobile_code" type="text" placeholder="输入手机验证码" />-->
<!--</div>-->
<!--<input class="verify-code-btn sendcode" id="jsSendCode" value="发送验证码">-->
<!--</div>-->
<!--<div class="form-group marb8">-->
<!--<label>密 码</label>-->
<!--<input id="jsPhoneRegPwd" name="password_m" type="password" placeholder="请输入6-20位非中文字符密码" />-->
<!--</div>-->
<!--<div class="error btns" id="jsMobileTips"></div>-->
<!--<div class="auto-box marb8">-->
<!--</div>-->
<!--<input class="btn btn-green" id="jsMobileRegBtn" type="button" value="注册并登录" />-->
<!--</form>-->
<!--</div>-->
<div class="tab-form">
<form id="email_register_form" method="post" action="{% url 'register' %}" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='gTZljXgnpvxn0fKZ1XkWrM1PrCGSjiCZ' />
<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 }}" value="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 }}" 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 %}</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="login.html">[立即登录]</a></p>
</div>
</div>
</div>
</section>
<input id="isLogin" type="hidden" value="False"/>
<script src="{% static 'js/jquery.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/unslider.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/validateDialog.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/login.min.js' %}" type="text/javascript"></script>
</body>
</html>
C:\Users\hlg\PycharmProjects\MxOnline\MxOnline\urls.py
# _*_ encoding:utf-8 _*_
"""MxOnline URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.9/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Add an import: from blog import urls as blog_urls
2. Import the include() function: from django.conf.urls import url, include
3. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls))
"""
from django.conf.urls import url, include
from django.contrib import admin
from django.views.generic import TemplateView # 专门处理静态文件
import xadmin
# from users.views import user_login
from users.views import LoginView, RegisterView, ActiveUserView
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
url('^$', TemplateView.as_view(template_name="index.html"), name="index"),
# url('^login/$', user_login, name="login")
url('^login/$', LoginView.as_view(), name="login"), # as_view()方法是把类转换成方法使用
url('^register/$', RegisterView.as_view(), name="register"),
url(r'^captcha/', include('captcha.urls')),
url(r'^active/(?P<active_code>.*)/$', ActiveUserView.as_view(), name="user_active")
]
C:\Users\hlg\PycharmProjects\MxOnline\apps\users\views.py
# _*_ encoding:utf-8 _*_
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend #
from django.db.models import Q # 完成并集
from django.views.generic.base import View #
from django.contrib.auth.hashers import make_password
# Create your views here.
from .models import UserProfile, EmailVerifyRecord
from .forms import LoginForm, RegisterForm
from utils.email_send import send_register_email
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
# 完成自己的逻辑
try:
# user = UserProfile.objects.get(username=username)
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
if user.check_password(password):
return user
except Exception as e:
return None
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()
return render(request, "login.html")
# Register+View 说明是一个处理前端请求的View类
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", "")
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})
# 基于类
class LoginView(View): # 继承View django的View会自动调用get ,post
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 is not None:
if user.is_active:
login(request, user) # 这个是系统提供的 login
return render(request, "index.html") # 登录成功,跳转到首页
else:
return render(request, "login.html", {"msg": "用户名或密码错误"}) # 验证失败
else:
return render(request, "login.html", {"msg": "用户名或密码错误"}) # 验证失败
else:
return render(request, "login.html", {"login_form":login_form}) # 登录失败,跳转到登录页面
C:\Users\hlg\PycharmProjects\MxOnline\apps\utils\email_send.py
# _*_ encoding:utf-8 _*_
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= 'AaBbCcDdEeFfGgHhIiJiKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
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()
code = random_str(16) # 生成一个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)
# 在settings.py中配置好之后,就可以发送邮件了
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
if send_status:
pass
注意下图的邮件配置