第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现

1,配置登录路由

from django.conf.urls import url, include                   # 导入django自在的include逻辑
from django.contrib import admin
from django.views.generic import TemplateView               # 导入django自带的TemplateView逻辑

import xadmin                                               # 导入xadmin

from app_users.views import deng_lu, zhu_ce, active_code, logout                 # 导入登录逻辑处理类

urlpatterns = [
    url(r‘^xadmin/‘, xadmin.site.urls),

    url(r‘^index.html‘, TemplateView.as_view(template_name=‘index.html‘), name=‘index‘),

    url(r‘^register.html‘, zhu_ce.as_view(), name=‘register‘),
    url(r‘^captcha/‘, include(‘captcha.urls‘), name=‘captcha‘),
    url(r‘^active/(?P<active_de>.*)/$‘, active_code.as_view(), name="user_active"),

    url(r‘^login.html‘, TemplateView.as_view(template_name=‘login.html‘), name=‘login‘),
    url(r‘^deng_lu‘, deng_lu.as_view(), name=‘deng_lu‘),
    url(r‘^logout‘, logout.as_view(), name=‘deng_lu‘),
]

2,编写表单验证

#!/usr/bin/env python
# -*- coding:utf8 -*-
# 表单验证

from django import forms                 # 导入Django的表单验证模块
from captcha.fields import CaptchaField

class deng_lu_forms(forms.Form):         # 自定义验证表单类,继承Django的表单验证类
    username = forms.CharField(
        required=True,
        max_length=20,
        min_length=2,
        error_messages={
            ‘required‘: ‘用户名不能为空‘,
            ‘max_length‘: ‘用户名长度不得超过20个字符‘,
            ‘min_length‘: ‘用户名长度不得少于2个字符‘,
        }
    )
    password = forms.CharField(
        required=True,
        max_length=20,
        min_length=2,
        error_messages={
            ‘required‘: ‘密码不能为空‘,
            ‘max_length‘: ‘密码长度不得超过20个字符‘,
            ‘min_length‘: ‘密码长度不得少于2个字符‘,
        }
    )

3,在逻辑处理里,进行表单验证,如果验证失败提示错误回填数据,如果验证成功,获取验证后的表单数据,将获取到的用户名拿到数据库查找用户是否存在,如果不存在提示用户不存在回填数据,如果存在获取到用户密码,用django的密码验证函数check_password(用户输入密码, 数据库加密密码),返回布尔值,如果一致返回真,如果密码正确创建session,向session里写入一个表示登录的键值,如果密码不正确提示密码错误回填数据

#!/usr/bin/env python
# -*- coding:utf8 -*-
import io  # 导入io模块

from django.shortcuts import render, HttpResponse, redirect                                 # 导入django向浏览器返回方法
from django.views.generic.base import View
from django.db.models import F,Q                                                            # 导入F和Q
from django.contrib.auth.hashers import make_password, check_password                       # 导入django密码加密,和密码验证
from django.contrib.auth import login                                                       # 调用django的登录函数

from app_users.forms import deng_lu_forms, zhu_ce_forms                                    # 导入登录页面表单认证
from app_users.models import Users, Email                                                   # 导入数据库操作
from utils.email_send import send_register_email                                            # 导入邮件发送

class deng_lu(View):
    def get(self, request):
        return render(request, ‘login.html‘, {})

    def post(self, request):
        f = deng_lu_forms(request.POST)                 # 实列化表单认证类,将用户post提交的数据传入进行认证
        if f.is_valid():                                # 判断认证是否成功
            tong_guo = f.cleaned_data                   # 认证成功,接收用户数据
            username = tong_guo[‘username‘]
            password = tong_guo[‘password‘]
            user = Users.objects.filter(username=username)
            if user:
                for i in user:
                    mima = i.password
                    pdmima = check_password(password, mima)
                    if not pdmima:
                        tishi = ‘密码不正确‘
                        return render(request, ‘login.html‘, {‘tishi‘: tishi})
                    else:
                        request.session["zhuang_tai"] = True                      # 创建session
                        request.session["username"] = username
                        # request.session["password"] = password
                        return redirect(‘/index.html‘)
            else:
                tishi = ‘用户不存在‘
                return render(request, ‘login.html‘, {‘tishi‘: tishi})
        else:                                                                   # 认证不成功,接收错误信息
            cuo_wu = f.errors                                                   # 接收错误信息
            return render(request, ‘login.html‘, {‘cuo_wu‘: cuo_wu})            # 将错误信息传到登录页面

class logout(View):
    def get(self, request):
        try:
            request.session.flush()
        except KeyError:
            pass

        return redirect(‘/index.html‘)

    def post(self, request):
        pass

4,settings.py配置session

# session配置
SESSION_COOKIE_NAME = "_sessionid_"             # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                       # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                    # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                   # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                  # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                    # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False         # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False              # 是否每次请求都保存Session,默认修改之后才保存(默认),默认就好

5,编写一个中间件来专门用于用户登录账号状态检测,在中间件里获取设置的session状态,通过request.META将登录状态向所有页面注入,在页面接收这个登录状态,判断如果登录显示会员区块,如果状态是没登录显示,注册和登录区块

#!/usr/bin/env python
# -*- coding:utf8 -*-
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render

class zhongjianjian(MiddlewareMixin):

    def process_request(self, request):
        print(‘有请求时执行‘)
        # print(request.META) #请求对象内容
        #在这里可以做ip访问拦截器

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print(‘逻辑处理之前执行‘)
        zhuang_tai = request.session.get("zhuang_tai")
        request.META[‘zhuang_tai‘] = zhuang_tai

        username = request.session.get("username")
        request.META[‘username‘] = username

    def process_exception(self, request, exception):
        print(‘出错时执行‘)
        # return render(request, ‘app1/cuowu.html‘)
        print(exception)
        #做程序出错时处理

    def process_response(self, request, response):
        print(‘响应后执行,无论是否出错‘)

        return response

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="{% static ‘css/reset.css‘ %}">     {# 启用静态文件引用后才可以 #}
    <link rel="stylesheet" type="text/css" href="{% static ‘css/animate.css‘ %}">
    <link rel="stylesheet" type="text/css" href="{% static ‘css/style.css‘ %}">

    <script src="{% static ‘js/jquery.min.js‘ %}" type="text/javascript"></script>
    <script src="{% static ‘js/jquery-migrate-1.2.1.min.js‘ %}" type="text/javascript"></script>

</head>
<body>
<section class="headerwrap ">
    <header>
        <div  class=" header">
             <div class="top">
                <div class="wp">
                    <div class="fl"><p>服务电话:<b>33333333</b></p></div>
                    <!--登录后跳转-->
                    {{ request.META.zhuang_tai }}
                    {% if request.META.zhuang_tai == True %}
                        <div class="personal">
                            <dl class="user fr">
                                <dd>{{ request.META.username }}<img class="down fr" src="/static/images/top_down.png"/></dd>
                                <dt><img width="20" height="20"
                                         src="/static/media/image/2016/12/default_big_14.png"/></dt>
                            </dl>
                            <div class="userdetail">
                                <dl>
                                    <dt><img width="80" height="80"
                                             src="/static/media/image/2016/12/default_big_14.png"/></dt>
                                    <dd>

                                        <h2>{{ request.META.username }}</h2>
                                        <p>{{ request.META.username }}</p>
                                    </dd>
                                </dl>
                                <div class="btn">
                                    <a class="personcenter fl" href="usercenter-info.html">进入个人中心</a>
                                    <a class="fr" href="/logout/">退出</a>
                                </div>
                            </div>
                        </div>
                    {% elif request.META.zhuang_tai != True %}
                        <a style="color:white" class="fr registerbtn" href="{% url ‘register‘ %}">注册</a>
                        <a style="color:white" class="fr loginbtn" href="/login.html">登录</a>
                    {% endif %}

                </div>
            </div>

回填数据以及错误提示html

回填数据 yanzh.email.value   表单对象.表单字段.value

<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 cuo_wu.email %}errorput{% endif %} ">
                            <label>邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱</label>
                            <input  type="text" id="id_email" name="email" value="{{ yanzh.email.value }}" placeholder="请输入您的邮箱地址" />
                        </div>
                        <div class="form-group marb8 {% if cuo_wu.password %}errorput{% endif %}">
                            <label>密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码</label>
                            <input type="password" id="id_password" name="password"  value="{{ yanzh.password.value }}" placeholder="请输入6-20位非中文字符密码" />
                        </div>
                        <div class="form-group marb8 captcha1 {% if cuo_wu.captcha %}errorput{% endif %}">
                            <label>验&nbsp;证&nbsp;码</label>
                            {{ yanzhm.captcha }}
                        </div>
                        <div class="error btns" id="jsEmailTips">
                            {% for key,error in cuo_wu.items %}{{ error }}{% endfor %}    #错误提示
                            {% if tishi %}{{ tishi }}{% endif %}
                        </div>
                        <div class="auto-box marb8">
                        </div>
                        <input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册并登录" />
                    <input type=‘hidden‘ name=‘csrfmiddlewaretoken‘ value=‘5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy‘ />
                    {% csrf_token %}
                    </form>
                </div>
时间: 2024-10-17 12:52:07

第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html的相关文章

第三百八十三节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置

第三百八十四节,Django+Xadmin打造上线标准的在线教育平台-路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, include # 导入django自在的include逻辑 from django.contrib import admin from django.views.generic import TemplateView # 导入django自带的TemplateView逻辑 import xadmin #

第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

第三百七十五节,Django+Xadmin打造上线标准的在线教育平台-创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课程机构APP,写数据库操作文件models.py models.py文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from __future__ import unicode_literals from datetime import datetim

第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

第三百八十六节,Django+Xadmin打造上线标准的在线教育平台-HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页面返回给浏览器 一般母板里都是写的一个网页里不变的地方,也就是通用的地方,被继承页(访问页)都是每个页面不同的地方,也就是将页面不同的地方引入到母板组合成一个新页面返回浏览器 母板里一般都是网页的.头部.底部.头部底部css.头部底部js 被继承页(访问页)里一般都是新内容,新内容的css和js 母

第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理

第三百八十节,Django+Xadmin打造上线标准的在线教育平台-将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点:xadmin的数据表注册,是到app下查找的adminx文件,所以我们必须在app下创建一个adminx.py文件,所有关于数据表注册到xadmin后台的代码都是写在adminx.py文件里 adminx.py文件编写 1.自定义一个类来继承object对象,这个类叫做数据表管理器 数据表管理器里

第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页

第三百八十九节,Django+Xadmin打造上线标准的在线教育平台-列表筛选结合分页 根据用户的筛选条件来结合分页 实现原理就是,当用户点击一个筛选条件时,通过get请求方式传参将筛选的id或者值,传入逻辑处理就行数据库条件查询,将查询条件值在返回html页面判断是否是选中样式,最后将所有需要关联的筛选请求加上彼此逻辑处理传回来的查询条件值 html请求传参 黄色背景为请求传参 红色背景为逻辑处理传过来的查询条件判断样式 <div class="wp butler_list_box li

第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

第三百七十六节,Django+Xadmin打造上线标准的在线教育平台-创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为app_operation的用户操作APP,写数据库操作文件models.py models.py文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from __future__ import unicode_literals from datetime i

第三百七十九节,Django+Xadmin打造上线标准的在线教育平台—xadmin的安装

第三百七十九节,Django+Xadmin打造上线标准的在线教育平台-xadmin的安装 xadmin介绍 xadmin是基于Django的admin开发的更完善的后台管理系统

第三百八十七节,Django+Xadmin打造上线标准的在线教育平台—网站上传资源的配置与显示

第三百八十七节,Django+Xadmin打造上线标准的在线教育平台-网站上传资源的配置与显示 首先了解一下static静态文件与上传资源的区别,static静态文件里面一般防止的我们网站样式的文件,包括ccs,js,网站样式图片 上传资源是用户操作上传的图片等资源 上传资源的配置 1,首先在项目里创建一个名称叫media的文件夹专门保存用户上传 2,settings.py文件配置上传资源的路径 # 上传资源路径,如果图片,上传文件等 MEDIA_URL = '/media/' # 设置上传资源

第三百八十一节,Django+Xadmin打造上线标准的在线教育平台—xadmin全局配置

第三百八十一节,Django+Xadmin打造上线标准的在线教育平台-xadmin全局配置 1.xadmin主题设置 要使用xadmin主题,需要在一个app下的adminx.py后台注册文件里,写一个主题管理器绑定xadmin的views.BaseAdminView注册一般我们会在用户相关的app下的adminx.py后台注册文件里写 #!/usr/bin/env python # -*- coding:utf8 -*- import xadmin from xadmin import vie