Django用户注册、登录、注销(一)
使用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用户注册、登录、注销(一)相关推荐
- python django 快速实现注册,登录,注销
临近年底,各种忙,好久没更新博客了,2017春节假期在即,距下班还有2小时,难得闲下来,来撸一手django简单的web注册,登录,注销. 环 境:centos 6.4 64bit python ...
- python django用户登录系统_Django实现用户注册登录
学习Django中:试着着写一个用户注册登录系统,开始搞事情 =====O(∩_∩)O哈哈~===== ================= Ubuntu python 2.7.12 Django 1. ...
- Django实现用户注册登录
学习Django中:写一个用户注册登录系统,开始搞事情 =====O(∩_∩)O~===== ================= Ubuntu python 2.7.12 Django 1.10.4 ...
- 一个公司采购申请审批系统,包含用户登录注销、用户创建、角色分配、采购申请审批及其他相关功能。
文章目录 一.开发环境 二.项目要求 总结 采购申请审批系统下载地址 一.开发环境 编程语言:C++ IDE:VS2019 OS:WIN10 二.项目要求 1.设计一个公司采购申请审批系统,包含用户登 ...
- PHP连接数据库实现用户注册登录功能
PHP连接数据库实现用户注册登录功能 代码如下 dbconnect.php login.html register.php login.php index.php logout.php ) 代码如下 ...
- Django实现登录、注册、修改密码、重置密码
需求: 1.实现Django的登录 2.实现Django的注册,校验用户名.密码的长度为6-20,邮箱是否合法,序列化等 3.实现根据ID或者用户名修改密码,ID为数据库的用户表的id 4.实现重置密 ...
- Linux学习(五)---开机、重启和用户登录注销
文章目录 Linux学习--开机.重启和用户登录注销 一.开机&重启命令 二.用户登录和注销 Linux学习–开机.重启和用户登录注销 一.开机&重启命令 基本介绍: ①shutdow ...
- php mysql 登录注销_laravel 实现用户登录注销并限制功能
1. 创建登录控制器 在项目根目录输入: php artisan make:controller Admin/LoginController 2.创建用户模块 以及数据库 php artisan ma ...
- Spring MVC定制用户登录注销实现示例
这篇文章描述了如何实现对Spring MVC Web应用程序的自定义用户访问(登录注销). 作为前提,建议读者阅读这篇文章 ,其中介绍了一些Spring Security概念. 该代码示例可从Spri ...
- Linux进阶之路————开机、重启和用户登录注销
关机.重启命令 shutdown 命令: 1)shutdown -h now 立即关机 2)shutdown -h 1 1分钟之后关机 3)shutdown -r no ...
最新文章
- AS3给图片加水印文字
- hive-数据倾斜记录分享
- ASP.NET Core开发常见“坑”
- 禁用内存清理_MySql那些事儿(二):InnoDB架构介绍之内存篇
- 《实现领域驱动设计》读书笔记
- 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
- 汇付 支付,痛苦的接入过程
- 抓取html的地址怎么写,跪求一个获取URL地址html代码的写法
- C# internal和public
- 连通性1 求无向图的low值
- iPhone手机弹窗BUG!每两分钟弹窗提醒一次,解决方案在这里
- rospy Odometry天坑小计
- 自动化测试方案设计和实现
- 【股票】股票交易的手续费介绍以及计算
- Verilog语言程序框架
- 桌面计算机图标管理打不开怎么回事,电脑桌面计算机图标打不开怎么办
- G. Columns Swaps(并查集)
- C#中如何隐藏滚动条(ScrollBar)同时又具备自动滚动的功能
- 数学中的鞍点、驻点、拐点、极值点
- Spark-submit:System memory 466092032 must be at least 471859200
热门文章
- linux缓存代码,Linux使用的缓存
- matlab画曲面二次,如何用matlab绘制二次B样条三维曲面(已知控制点和节点矢量)?...
- java BigDecimal去掉小数点后的零
- java双层for循环
- 操作系统的运行机制和体系机构
- lamba统计最大值,最小值,平均值,总和,个数
- Qt 在designer 中给QToolBar 添加 action控件
- 收集21个经典Java面试题
- python request post 数组_[pve][python]用python3获取pve状态信息
- ping不通docker_初识docker