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 authauth.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 Userdef 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 Userdef 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 urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = [ 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),]
Title
Title
Title hello {
{ user.username }} 注销
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文件
#}{#第二种,灵活一般用第二种#}Title {#第一种,不是太灵活#}{#
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标签中。
详细信息