django认证系统(auth):
1.首先我们在新窗口中打开一个django项目,之后点击,
2.在这个界面中相当于使用了python manage.py 的管理命令,可以有提示的作用。
3.选择你要连接的数据库,然后运行migrate命令,由于我们没有进行记录操作(即makemigrations),所以产生的表都是django自带 的表。剪箭头号所指的就是我们认证系统所操作的表啦。
4.打开这张表看一下,一般我们用username(用户名),password(密码),is_superuser(是否为超级用户,是为1,不是为0),默认这张表的 字段可以为空。想用那个就传哪个。
5.之后再步骤2中的界面输入createsuperuser,创建一个超级用户,按要求输入,之后就可以发现出现了一行记录了,之后操作看代码。
6.auth,user的操作
from django.contrib import auth auth.authenticate(useranme=user,password=pwd) #添加用户 auth.login(request,user) #写入session数据 auth.logout(request) #注销用户,清除session的数据 from django.contrib.auth.models import User #对表auth_user的操作 user = request.user #取到当前登陆的用户名称 user.is_authenticated() #验证当前用户是否存在 user= User.objects.create_user(username=user,password=pwd) #创建用户,把密码装换成一堆字符的形式,对明文进行加密。
7.登陆练习,注册练习。
#--------------------auth认证 from django.contrib import auth # from django.contrib.auth.models import User def login(request): if request.method=="POST": user=request.POST.get('user') pwd = request.POST.get('passwd') user=auth.authenticate(username=user,password=pwd) print('user1:',request.user) #打印结果是AnonymousUser,因为没有设置session,即没有登陆 # #return user or AnonymousUser() 源码中这样写的. #把password密码转成密文的然后去数据库过滤,如果查到了,返回一个对象(auth_user的对象),否则返回None if user: auth.login(request,user) #等价于你自己写request.session[],需要两个参数,用户名 print('user2:', request.user) #打印结果是当前用户 #request.user 可以取到当前用户登陆的对象。(request.user=user),如果用户不在登陆状态,request.user=AnonymousUser #request.user 是个全局变量. return redirect('/index/') return render(request,'login.html',locals()) from django.contrib.auth.models import User def index(request): user = request.user # if not user.id: # return redirect("/login/") if not user.is_authenticated():return redirect("/login/") username=user.username return render(request,'index.html',locals()) def logout(request): # request.session.flush() print('logout') auth.logout(request) #清除已注册的session,默认在django的session表中 return redirect('/login/') #上方的User相当于auth_user那张表 def reg(request): if request.method=="POST": user=request.POST.get("user") pwd=request.POST.get("pwd") # print(user,pwd) user= User.objects.create_user(username=user,password=pwd) return redirect('/login/') return render(request,'reg.html',locals())
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index), url(r'^logout/', views.logout), url(r'^reg/',views.reg), ]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-3.3.1.js"></script> </head> <body> <form action="/login/" method="post"> {% csrf_token %} <p>用户名:<input type="text" name="user" class="u_p" id="user"> <p>密码: <input type="password" name="passwd" class="u_p" id="passwd"></p> <p><input type="submit" id="auth" value="提交"></p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-3.3.1.js"></script> </head> <body> <form action="/reg/" method="post"> {% csrf_token %} <p>用户名:<input type="text" name="user" class="u_p" id="user"> <p>密码: <input type="password" name="pwd" class="u_p" id="passwd"></p> <p><input type="submit" id="auth" value="提交"></p> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-3.3.1.js"></script> </head> <body> <p>hello {{ user.username }}</p> <a href="/logout/">注销</a> </body> </html>
form组件:
form组件的优势:
1.重置数据,不会清空数据,比如你输入信息的时候,输错了,form组件会帮你保留已填的字段
2.校验方便。
1.form组件的使用,结合登陆操作来记录,基础:
有点类似创建数据库的表操作,也是一个类的形式,然后可以是实例化去使用
views.py中的form创建
from django import forms
from django.forms import widgets #更改功能
class LoginForm(forms.Form): user=forms.CharField(label="用户名",min_length=3,max_length=8, error_messages={"min_length":"太短","required":"必填"}) #在这个error_messages中可以定制错误信息,触发哪个错误就会输出那个错误信息,required是为空的时候出发的信息
#是设置这个标签的名字,min_length是对这个标签的限制条件,还有很多,根据类型的不同。
pwd=forms.CharField(label="密码",min_length=5,widget=widgets.PasswordInput(attrs={"class":"form-control"}))
#在这个widget后面加上attrs可以在里面用字典型的形式添加类,来实现样式的改变.比如在使用bootstrap中添加
下方view.py中的login函数:
def login(request): if request.method=="POST": login_form=LoginForm(request.POST) #实例化一个对象,将数据直接扔进去就行,不符合的他自己会过滤掉 if login_form.is_valid(): #这个是判断的用户的输入,是否符合input标签的限制条件,是所有 print(login_form.cleaned_data) #将符合的数据放入cleaned_data这个字典中{"user":user} else: # print(login_form.cleaned_data) # print(login_form.errors) # print(login_form.errors.get('user')) #上面这些注释掉,用的时候,用模版语言在html中取. return render(request, 'login_form.html', locals()) #注意这个返回值和下边这个不一样,一个有值,一个没值. # from组件的功能:1渲染标签 login_form=LoginForm() #这里是一个空的值。 return render(request,'login_form.html',locals())
get请求login_form=LoginForm()
post请求login_form=LoginForm(request.POST)
html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {#第一种,不是太灵活#} {#<form action="" method="post" novalidate>#} {# novalidate选项阻止浏览器私自给我做校验 #} {# {% csrf_token %}#} {# {{ login_form.as_p }}#} {# <input type="submit" value="提交">#} {#</form>#} {#第二种,灵活一般用第二种#} <form action="" method="post" novalidate> {# novalidate选项阻止浏览器私自给我做校验 #} {% csrf_token %} <div> <label for="">{{ login_form.user.label }}</label> {{ login_form.user }} <span style="color: red">{{ login_form.errors.user.0 }}</span> {# 因为login_form.erros.user取出的是一个列表,所以需要加索引,因为模版语言的话,仅仅把能渲染出来的东西渲染出来 #} </div> <div> <label for=""> {{ login_form.pwd.label }}</label> {{ login_form.pwd }} <span>{{ login_form.errors.pwd.0 }}</span> </div> <input type="submit" value="提交"> </form> </body> </html>
2.form组件的挂钩的使用:
放在form的class中。
from django.core.exceptions import NON_FIELD_ERRORS,ValidationError
###局部钩子,必须按照格式写,内部只认clean_%s %x 的形式,抛出异常只能是ValidationError,源代码只能捕获ValidationError
def clean_user(self):
val = self.cleaned_data.get('user')
if not val.isdigit():
return val #返回val值放入通过字典中.
else:
raise ValidationError("用户名不能是纯数字") #之后异常会出现在login.html中的span标签中。
详细信息