概要:html
form组件回顾: (1) 建立form组件对应的类,好比LoginForm (2) views.login: if get请求: form_obj=LoginForm() return render(request,"login.html",{"form_obj":form_obj}) # 由form_obj渲染form表单的有效控件 渲染方式三种: 1 <form action="" novalidate method="post"> {% csrf_token %} {{ form_obj.as_p }} <input type="submit"> </form> 2 <form action="" novalidate method="post"> {% csrf_token %} <div> <label for="">用户名</label> {{ form_obj.user }} <span>{{ form_obj.errors.user.0 }}</span> </div> <div> <label for="">密码</label> {{ form_obj.pwd }}<span>{{ form_obj.errors.pwd.0 }}</span> </div> <input type="submit"> </form> 3 <form action="" novalidate method="post"> {% csrf_token %} {% for field in form_obj %} <div> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <input type="submit"> </form> if post请求: form_obj = LoginFrom(request.POST) if form_obj.is_valid(): form_obj.cleaned_data # 全部的有效数据 else: #form_obj.errors # {} #form_obj.errors.get("user") # [] return render(request, "login.html", {"form_obj": form_obj}) 2 auth --- django的认证系统 A S session写操做 request.session["user"]=user ''' 一、生成随机字符串 二、写cookie {"sessionID":"234asd243dv35fd"} 三、django-session表: session-key session-data 234asd243dv35fd {"user":"alex"} ''' session读操做 user=request.session.get("user") ''' 1 {"sessionID":"234asd243dv35fd"} 2 django-session表: session-key session-data 234asd243dv35fd {"user":"alex"} 3 {"user":"alex"}.get("user") ''' request.session究竟是什么? 认证系统: request.user 1 使用auth_user表做为用户表 2 登陆: user=auth.authenticate(username=user,password=pwd) auth.login(request,user) # session写操做 3 注销 auth.logout(request) # session删操做 request.session.flush() 4 验证 user.is_authenticated() # 登陆状态时,返回True,不然返回False 5 建立用户:User.objects.create_user(username="egon123",password="1234") 今日做业: 1 看 session 中间件源码 2 基于用户认证明现 登陆注册注销功能,登陆用户与未登陆用户显示不一样页面
咱们的登陆验证是浏览器级别的验证还有用户级别的验证,前端
使用咱们的django内部的数据库表,auth_user,而后使用它内部的一些模块和方法数据库
在视图函数里面须要引入模块写逻辑代码:django
from django.shortcuts import render,redirect
# Create your views here.
from django.contrib import auth
from django.contrib.auth.models import User
# 以上两句是固定模式,
def log_in(request):
if request.method=="POST":
user=request.POST.get("user")
pwd=request.POST.get("pwd")
# 验证成功,返回user对象,不然返回None
user=auth.authenticate(username=user,password=pwd)
if user:
auth.login(request,user) # session写操做
return redirect("/index/")
return render(request,"login.html")
def index(request):
print(request.user)
print(type(request.user))
# if not request.user.id:
# return redirect("/login/")
# user=request.user
# if not user.is_authenticated():return redirect("/login/")
return render(request,"index.html",locals())
def log_out(request):
auth.logout(request)
return redirect("/login/")
def reg(request):
User.objects.create_user(username="egon123",password="1234")
return redirect("/login/")
authenticate()后端
提供用户认证,即验证用户名以及密码是否正确,通常须要表中的username,password连个关键字参数.浏览器
若是认证信息有效,会返回一个user对象,authenticate()会在user对象上设置一个属性,表示那种认证后端认证了该用户,且该信息在后面的登陆过程当中是须要的,当咱们试图登陆一个从数据库中取出来不通过authenticate()的user对象会报错!cookie
在验证中咱们有几种状态固定语句:session
登陆:login框架
user1=auth.authenticate(username=user,password=pwd)ide
auth.login(request,user1) # 相似于session写操做
此函数使用django的session框架给某个已经认证的用户附加上session等信息
==============================================================
退出登陆状态:logout
auth.logout(request)
request.session.flush()
该函数接收一个httprequest的对象没有返回值,当调用该函数的时候,当前请求的session信息会所有清除,该用户没有登陆,使用该函数也不会报错.
=================================================
验证 :User对象的is_authenticated()方法
user.is_authenticated()
登陆状态时,返回True,不然返回False
1,当用户登陆时才能够访问某些页面,(有点相似于咱们的cookie和session设置的状态)
2,若是没有登陆,系统会检测到,而后强行让用户去登陆,会自动就把页面跳转到登陆页面去
3,用户在跳转的登陆界面中完成了登陆后,自动访问到跳转登陆以前所访问的地址
方法一:
def login(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LONGING_URL,request.path)) # 这里是比较简单的
方法二:
from django.contrib.auth.decorators import login_required
@login_required
def login(request):
```````
若是用户没有登陆的话,会跳转到django默认的登陆url'/accounts/login/'(这里的值经过settings文件中LOGIN_URL进行修改).并传递,当前访问url的绝对路径(登陆成功后,会重定向到该路径)
===================================================
建立用户:
user.objects.create_user(username='egon',password='1234')
User对象:
若是是真正的user对象,返回值恒为True.用于检查用户是否已经经过了认证,经过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表名用户成功经过了认证.在后台用request.user.is_authenticated()判断用户是否已经登陆,若是True则能够向前台展现request.user.name
check_password(passwd)
用户修改密码以前让其输入原来的密码进行校验,经过了验证以后返回True
而后使用set_password()来修改密码
咱们下面的示例就是一个简单的index页面,咱们的用户若是登陆的话就能够看到该页面的设置了用户权限的信息,
若是没有登陆就会看到这个页面没有设置用户权限的信息.这两种状态都是经过咱们的auth内置方法去实现的.
具体代码以下,
views视图函数:
from django.shortcuts import render, redirect # Create your views here. from django.contrib import auth from django.contrib.auth.models import User # 登陆+注册页面 def login1(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') username = auth.authenticate(username=user, password=pwd) if username: auth.login(request, username) return redirect('/auth/index1/') else: # 这里就是注册,create_user这一句话就完成了注册效果 User.objects.create_user(username=user, password=pwd) return redirect('/auth/index1') return render(request, 'proof/login1.html') # 登陆与否皆可显示该页面效果 def index1(request): user = request.user return render(request, 'proof/index1.html', locals()) # 注销 def out(request): auth.logout(request) return redirect('/auth/login1') # 注册页面 def reg(request): return redirect('/auth/login1') # 修改密码 def set_pwd(request): user = request.user state = None if request.method == 'POST': old_pwd = request.POST.get("old_pwd",) new_pwd = request.POST.get('new_pwd',) repeat_password = request.POST.get('repeat_pwd',) if user.check_password(old_pwd): if not new_pwd: state = 'empty' elif new_pwd != repeat_password: state = 'repeat_error' else: user.set_password(new_pwd) user.save() return redirect('/auth/login1') else: # 咱们这里是在作逻辑判断,若是咱们在修改的密码的时候不当心输错了, # 咱们的页面须要有提示信息告诉用户输入错误请从新输入 state = '密码有误,请核对后再输' content = { # 这里的字典是什么意思啊,使用locals把这个content传到咱们的模板里面而后若是输入密码有误的话 # 就显示下面的这个字符串: {'user': <SimpleLazyObject: <User: wusir>>, 'state': '密码有误,请核对后再输'}, # 老师的代码里面直接写的content,我也不知道这个content须要放到哪里去,唉 'user': user, 'state': state, } return render(request, 'proof/set_password.html', locals()) return render(request, 'proof/set_password.html')
前端HTML页面:
登陆/注册页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>index1</title> </head> <body> {#<form action="/auth/index1/" method="post">#} <form action="" method="post"> {% csrf_token %} <p>用户名 <input type="text" name="user"></p> <p>密码 <input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>
index页面(在这里进行逻辑判断用户是不是登陆状态):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>index1</title> <style> .a1{ float:right } </style> </head> <body> <h1>welcome here</h1> <p>hello {{ user }}</p> <hr> {% if request.user.is_authenticated %} <a class="a1" href="/auth/out/">注销</a> <a class="a1" href="/auth/set_pwd">修改密码</a> <h2>you're coming home {{ request.user.username }}</h2> {% else %} {# 咱们这里不用后端的视图函数去作判断,就直接用咱们的前端的模板语言的逻辑去作筛选#} <a href="/auth/login1/">登陆</a> <a href="/auth/reg/">注册</a> {% endif %} </body> </html>
修改密码页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <div>旧密码: <input type="password" name="old_pwd"><span>{{ content }}</span></div> <p>新密码: <input type="password" name="new_pwd"></p> <div>确认密码: <input type="password" name="repeat_pwd"></div> <button type="submit" value="put in">提交</button> </form> <script> </script> </body> </html>
url配置:
from django.conf.urls import url from auth1 import views, session urlpatterns = [ url(r'^login1/$', views.login1), url(r'^reg/$', views.reg), url(r'^index1/$', views.index1), url(r'^out/$', views.out), url(r'^set_pwd/$', views.set_pwd), ]