用Django编写邮箱注册以及验证码(二)

在完成注册邮箱的操作之后, 我们还需要完成登录操作以及建一个全新的网站, 来让项目更好看一点

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

扫描二维码关注公众号,回复: 753317 查看本文章


# -*- 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应该显示成如下界面:








猜你喜欢

转载自blog.csdn.net/qq_41664526/article/details/80084754