在完成注册邮箱的操作之后, 我们还需要完成登录操作以及建一个全新的网站, 来让项目更好看一点
1. 在templates文件下在新建一个html, 用来作为登录界面, 起名为: enter.html
里面的代码逻辑和注册邮箱的基本一致, 不在过多描述
2. 为了使项目层次分明, 我们在新建一个app, 起名为:login
在views.py中我们写登录和注销的逻辑
from django.shortcuts import render, redirect
from .forms import LoginFrom
# Create your views here.
from app.models import UserProfile
# Q表示查询条件
from django.db.models import Q
from django.contrib.auth.hashers import make_password
from django.contrib.auth import authenticate
from django.contrib.auth import login, logout
from django.contrib.auth.backends import ModelBackend
# 登录
def enter(request):
if request.method == 'GET':
form = LoginFrom()
return render(request, 'enter.html', {'form': form})
elif request.method == 'POST':
# 创建表单对象
form = LoginFrom(request.POST)
rs=form.is_valid()
print(rs)
# 验证表单数据是否合法
if form.is_valid():
# 登录操作, cleaned_data 读取表单的值,返回的是一个字典
email = form.cleaned_data['email']
password = form.cleaned_data['password']
# 判断该用户密码是否正确
# 直接使用密码==密码是不行的, 需要对密码加密后再判断
# authenticate 会对password进行加密之后再对比
user = authenticate(request=request, username=email, password=password)
if user is not None:
# 执行django的login函数, 坐登录
login(request, user)
# 返回主页
# render 会重新渲染页面, 不会刷新url地址
# 这里需要, 刷新url, 并且渲染页面, redirect重定向
return redirect('/')
else:
return render(request, 'enter.html', {'form': form, 'errMsg': '账号或密码错误, 请检查后重新登录'})
else:
return render(request, 'enter.html', {'form': form})
# 自定义验证类
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
# 可以通过eamil\mobile...账号进行账号登录
# 这里需要将输入框设为char类型
user = UserProfile.objects.get(Q(email=username) | Q(mobile=username))
# check_password 验证用户的密码是否正确
if user.check_password(password):
return user
else:
return None
except Exception as e:
return None
# 注销
def log_out(request):
logout(request)
return redirect('/')
3. 在urls中配置登录和注销的url
# -*- coding: utf-8 -*-
# __author__ = 'ZKL'
# __date__ = '2018/4/25 10:56'
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.enter, name='enter'),
url(r'^logout', views.log_out, name='logout'),
]
4. 新建forms.py文件, 我们需要对字段在做出一些修改
# -*- coding: utf-8 -*-
# __author__ = 'ZKL'
# __date__ = '2018/4/25 11:06'
from django import forms
from captcha.fields import CaptchaField
class LoginFrom(forms.Form):
# 这里修改为char类型, 用户输入手机号, 或者昵称也能匹配登录
email = forms.CharField(required=True)
password = forms.CharField(required=True, min_length=6)
# 验证码
captcha = CaptchaField()
5. 附上enter.html的代码
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">
<title>登陆</title>
<style>
.errorlist{
padding-left: 0;
}
.errorlist > li{
list-style: none;
color: red;
font-size: 19px;
}
.errborder{
border-color: red;
box-shadow: 0 0 5px red;
}
</style>
<!-- Bootstrap core CSS -->
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="{% static 'css/singin.css' %}" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<form class="form-signin" action="{% url 'enter' %}" method="post">
{% csrf_token %}
<h2 class="form-signin-heading text-center">请登录</h2>
<label for="inputEmail" class="sr-only">邮箱地址</label>
<input name="email" type="text" id="inputEmail" class="form-control {% if form.email.errors %} errborder {% endif %}" placeholder="邮箱地址/手机号" required value="{% if form.email.value %}{{ form.email.value }}{% endif %}">
{{ form.email.errors }}
<label for="inputPassword" class="sr-only">密码</label>
<input name="password" type="password" id="inputPassword" class="form-control {% if form.password.errors %} errborder {% endif %}" placeholder="密码" required value="{% if form.password.value %}{{ form.password.value }}{% endif %}">
{{ form.password.errors }}
{# 验证码 #}
{{ form.captcha }}
{{ form.captcha.errors }}
{% if errMsg %}
<h3>{{ errMsg }}</h3>
{% endif %}
<button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
</form>
<h3 class="text-center"><a href="{% url 'index' %}">没有账号?去注册</a></h3>
</div> <!-- /container -->
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</body>
</html>
6. 在templates中新建一个html, 作为你的主页, 起名为: homepage.html
7. 新建一个app, 起名为: page
在views.py文件中, 我们配置它的视图函数
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'index.html')
8. 在你的项目的主urls.py中配置它的路由, 让用户访问的时候首先访问这个页面
url(r'^$', views.index, name='page')
9. 附上homepage.html的代码
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">
{% block title %}
<title>注册</title>
{% endblock %}
<!-- Bootstrap core CSS -->
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
<style>
.a_pad{
padding: 0px !important;
position: relative;
top: 10px;
margin-right:10px ;
}
</style>
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">首页</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">搜搜<span class="sr-only">(current)</span></a></li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="请输入搜索关键词">
</div>
<button type="submit" class="btn btn-default">搜索</button>
</form>
<ul class="nav navbar-nav navbar-right">
{# 未登录显示按钮 #}
{# 判断用户是否已经登录 #}
{% if request.user.is_authenticated %}
{# 登录后显示的按钮 #}
<li><a href="#"><img src="" alt=""></a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ request.user.email }}<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">个人中心</a></li>
<li><a href="#">登录后台</a></li>
<li><a href="#">历史记录</a></li>
<li role="separator" class="divider"></li>
<li><a href="{% url 'logout' %}">注销</a></li>
</ul>
</li>
{% else %}
<li><a class="a_pad" href="{% url 'enter' %}"><button class="btn btn-success">登录</button></a></li>
<li><a class="a_pad" href="{% url 'index' %}"><button class="btn btn-success">注册</button></a></li>
{% endif %}
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
{% block main %}
{% endblock %}
<script src="{% static 'js/jquery.min.js' %}"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="{% static 'js/bootstrap.min.js' %}"></script>
</body>
</html>
注: 里面的block是为了以后使用这个模板做准备
10. 这样在用户注册邮箱后, 就可以进行登录了.
在登录的时候, 你的数据库的users应该显示成如下界面: