使用Django自带的用户认证系统编写认证、登录、注销基本功能

功能:

使用Django默认的User表

1)注册

  判断是否已存在此用户,存在的话提示报错“用户已存在”;

  判断两次输入的密码是否一致,不一致的话提示报错“密码不一致”。

 实现报错提示的方式有两种:

  第一种:在form表单中使用clean_函数进行定义判断函数,在views中进行的is_valid()判断时进行校验,并获取错误传送到模板中显示在前端。

  第二种:直接在views视图中判断

2)登录

  登录成功,跳转到主页index;

  登录不成功,初始化登录页面;

  跳转到注册页面。

3)主页

  直接访问主页,用户没有登录的话跳转到登录页面; 

  用户已登录显示用户登录名。

4)注销

  清除登录的session,退出登录

项目目录结构:

mysite/setting设置

注册应用:

更改时区和语言设置

from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [path('admin/', admin.site.urls),url(r'^djauth/',include('djauth.urls',namespace='djauth')),]

mysite/urls.py

from django.urls import re_path
from . import views
app_name='djauth'
urlpatterns=[re_path(r'^$',views.index),re_path(r'register/$',views.register,name="register"),re_path(r'login/$',views.login_view,name="login"),re_path(r'logout/$',views.logout_view,name="logout"),
]

djauth/urls.py

from django import forms
from django.contrib.auth.models import User
class login_form(forms.Form):username=forms.CharField(max_length=30)password=forms.CharField(widget=forms.PasswordInput)class register_form(forms.Form):username=forms.CharField(max_length=30,label="姓名")email=forms.EmailField()password=forms.CharField(widget=forms.PasswordInput,min_length=3,label="密码")password_re=forms.CharField(widget=forms.PasswordInput,min_length=3,label="确认密码")#第一种报错方式,使用form表单,views中捕捉##clean_字段,,在视图views使用is_valid时自动严重表单字段的有效性# def clean_username(self):#     cd=self.cleaned_data#     user=User.objects.filter(username=cd['username'])#     if user:#         raise forms.ValidationError('用户已存在')#     return cd['username']# def clean_password_re(self):#     cd=self.cleaned_data#     if cd['password']!=cd['password_re']:#         raise forms.ValidationError("密码不一致")#     return cd['password_re']

djauth/forms.py

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
import time
from django.contrib import auth
from django.contrib.auth.models import User
from . import forms#访问index首页前先判断用户是否登录,没有登录的话需要跳转到login登录
#实现方式一:判断request.user.is_authenticated
# def index(request):
#     #验证用户是否登录成功
#     if  request.user.is_authenticated:
#         # request.user.username;;获取登录用户名
#         print("UserAuth:",request.user.username)
#         return render(request,"djauth/index.html")
#     else:
#         return redirect("/djauth/login/")
#实现方式二:使用@login_required装饰器
#login_required装饰器会先判断用户是否登录,如果没有登录则自动跳转到login_url路径,
#默认跳转路径是/accounts/login/,并在登录后跳转到原先的请求路径;如请求路径/djauth、,
#默认跳转路径为/accounts/login/?next=/djauth/#示例:
#没有login_url
#[13/Dec/2018 14:40:16] "GET /djauth/ HTTP/1.1" 302 0
#302跳转
#[13/Dec/2018 14:40:16] "GET /accounts/login/?next=/djauth/ HTTP/1.1"
#指定loging_url
#[13/Dec/2018 14:41:31] "GET /djauth/ HTTP/1.1" 302 0
#[13/Dec/2018 14:41:32] "GET /djauth/login/?next=/djauth/ HTTP/1.1" 200 725
#[13/Dec/2018 14:42:35] "POST /djauth/login/?next=/djauth/ HTTP/1.1" 302 0
#302登录成功后自动跳转
#[13/Dec/2018 14:42:35] "GET /djauth/ HTTP/1.1" 200 263
from django.contrib.auth.decorators import login_required
@login_required(login_url="/djauth/login/")
def index(request):return render(request,"djauth/index.html")def register(request):errors=[]if request.method=='POST':#初始化表单RegisterForm=forms.register_form(request.POST)#验证表单的输入是否有效,格式是否正确if RegisterForm.is_valid():# 第一种报错方式,捕捉form表单的报错##获取表单有效的值# Register=RegisterForm.cleaned_data##创建用户# user=User.objects.create_user(username=Register['username'],#                               password=Register['password'],#                               email=Register['email']#                               )##保存# user.save()# return HttpResponse("注册成功")##获取form表单clean函数中raise的错误#errors=RegisterForm.errors#第二种报错方式,直接在views中判断Register=RegisterForm.cleaned_data#判断用户是否存在user_exist=User.objects.filter(username=Register['username']).exists()if user_exist:errors.append("用户已存在")if Register['password']!=Register['password_re']:errors.append("密码不一致")else:user=User.objects.create_user(username=Register['username'],password=Register['password'],email=Register['email'])user.save()return HttpResponse("注册成功")#初始化表单RegisterForm=forms.register_form()return render(request,"djauth/register.html",{"RegisterForm":RegisterForm,"errors":errors})def login_view(request):error=[]curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())if request.method=='POST':LoginForm=forms.login_form(request.POST)if LoginForm.is_valid():Account=LoginForm.cleaned_data#验证User表中用户的账号密码是否正确,验证通过,返回用户名,不通过,返回Noneuser=auth.authenticate(username=Account['username'],password=Account['password'])if user is not None:#判断账户是否活跃if user.is_active:auth.login(request,user)return redirect("/djauth/")else:error.append("用户无效")else:error.append("账号或密码错误")else:LoginForm=forms.login_form()return render(request,'djauth/login.html',{"LoginForm":LoginForm,"curtime":curtime,"error":error})def logout_view(request):#清除session,登出
    auth.logout(request)return redirect("/djauth/login")

djauth/views.py

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

djauth/templates/djauth/base.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<h1>首页</h1>
<!--获取登录用户名:request.user.username或user.username-->
{% if request.user.is_authenticated %}{{ user.username }}
{% endif %}<p><a href="{% url 'djauth:logout' %}">退出</a></p>
</body>
</html>

djauth/templates/djauth/index.html

{% extends "djauth/base.html" %}{% block title %}
Login Page
{% endblock %}{% block content %}
<h1>Login Page</h1>{% if error %}{{ error }}{% endif %}<p>时间:{{ curtime }}</p><form action="" method="post">{% csrf_token %}{{ LoginForm.as_p }}<input type="submit" value="Login"></form><p>没有账号?点击<a href="{% url 'djauth:register' %}">注册</a></p>
{% endblock %}

djauth/templates/djauth/login.html

{% extends "djauth/base.html" %}
{% block title %}
Register Page
{% endblock %}{% block content %}
<h1>Register Page</h1>{% if errors %}<p>{{ errors }}</p>{% endif %}<form action="" method="post">{% csrf_token %}{% for foo in RegisterForm %}<p>{{ foo.label_tag }}{{ foo }} {{ errors.foo }}</p>{% endfor %}<input type="submit" value="注册"></form>
{% endblock %}

djauth/templates/djauth/register.html

转载于:https://www.cnblogs.com/kikkiking/p/10113154.html

Django用户注册、登录、注销(一)相关推荐

  1. python django 快速实现注册,登录,注销

    临近年底,各种忙,好久没更新博客了,2017春节假期在即,距下班还有2小时,难得闲下来,来撸一手django简单的web注册,登录,注销. 环   境:centos 6.4 64bit python ...

  2. python django用户登录系统_Django实现用户注册登录

    学习Django中:试着着写一个用户注册登录系统,开始搞事情 =====O(∩_∩)O哈哈~===== ================= Ubuntu python 2.7.12 Django 1. ...

  3. Django实现用户注册登录

    学习Django中:写一个用户注册登录系统,开始搞事情 =====O(∩_∩)O~===== ================= Ubuntu python 2.7.12 Django 1.10.4 ...

  4. 一个公司采购申请审批系统,包含用户登录注销、用户创建、角色分配、采购申请审批及其他相关功能。

    文章目录 一.开发环境 二.项目要求 总结 采购申请审批系统下载地址 一.开发环境 编程语言:C++ IDE:VS2019 OS:WIN10 二.项目要求 1.设计一个公司采购申请审批系统,包含用户登 ...

  5. PHP连接数据库实现用户注册登录功能

    PHP连接数据库实现用户注册登录功能 代码如下 dbconnect.php login.html register.php login.php index.php logout.php ) 代码如下 ...

  6. Django实现登录、注册、修改密码、重置密码

    需求: 1.实现Django的登录 2.实现Django的注册,校验用户名.密码的长度为6-20,邮箱是否合法,序列化等 3.实现根据ID或者用户名修改密码,ID为数据库的用户表的id 4.实现重置密 ...

  7. Linux学习(五)---开机、重启和用户登录注销

    文章目录 Linux学习--开机.重启和用户登录注销 一.开机&重启命令 二.用户登录和注销 Linux学习–开机.重启和用户登录注销 一.开机&重启命令 基本介绍: ①shutdow ...

  8. php mysql 登录注销_laravel 实现用户登录注销并限制功能

    1. 创建登录控制器 在项目根目录输入: php artisan make:controller Admin/LoginController 2.创建用户模块 以及数据库 php artisan ma ...

  9. Spring MVC定制用户登录注销实现示例

    这篇文章描述了如何实现对Spring MVC Web应用程序的自定义用户访问(登录注销). 作为前提,建议读者阅读这篇文章 ,其中介绍了一些Spring Security概念. 该代码示例可从Spri ...

  10. Linux进阶之路————开机、重启和用户登录注销

    关机.重启命令 shutdown 命令: 1)shutdown -h now       立即关机 2)shutdown -h 1           1分钟之后关机 3)shutdown -r no ...

最新文章

  1. AS3给图片加水印文字
  2. hive-数据倾斜记录分享
  3. ASP.NET Core开发常见“坑”
  4. 禁用内存清理_MySql那些事儿(二):InnoDB架构介绍之内存篇
  5. 《实现领域驱动设计》读书笔记
  6. 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
  7. 汇付 支付,痛苦的接入过程
  8. 抓取html的地址怎么写,跪求一个获取URL地址html代码的写法
  9. C# internal和public
  10. 连通性1 求无向图的low值
  11. iPhone手机弹窗BUG!每两分钟弹窗提醒一次,解决方案在这里
  12. rospy Odometry天坑小计
  13. 自动化测试方案设计和实现
  14. 【股票】股票交易的手续费介绍以及计算
  15. Verilog语言程序框架
  16. 桌面计算机图标管理打不开怎么回事,电脑桌面计算机图标打不开怎么办
  17. G. Columns Swaps(并查集)
  18. C#中如何隐藏滚动条(ScrollBar)同时又具备自动滚动的功能
  19. 数学中的鞍点、驻点、拐点、极值点
  20. Spark-submit:System memory 466092032 must be at least 471859200

热门文章

  1. linux缓存代码,Linux使用的缓存
  2. matlab画曲面二次,如何用matlab绘制二次B样条三维曲面(已知控制点和节点矢量)?...
  3. java BigDecimal去掉小数点后的零
  4. java双层for循环
  5. 操作系统的运行机制和体系机构
  6. lamba统计最大值,最小值,平均值,总和,个数
  7. Qt 在designer 中给QToolBar 添加 action控件
  8. 收集21个经典Java面试题
  9. python request post 数组_[pve][python]用python3获取pve状态信息
  10. ping不通docker_初识docker