博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django 认证模块auth,表单组件form
阅读量:5738 次
发布时间:2019-06-18

本文共 5560 字,大约阅读时间需要 18 分钟。

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())
views.py
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),]
urls.py
    
Title
{
% csrf_token %}

用户名:

密码:

login.html
    
Title
{
% csrf_token %}

用户名:

密码:

reg.gtml
    
Title

hello {

{ user.username }}

注销
index.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文件

    
Title{#第一种,不是太灵活#}{#
#} {# novalidate选项阻止浏览器私自给我做校验 #}{# {% csrf_token %}#}{# {
{ login_form.as_p }}#}{#
#}{#
#}{#第二种,灵活一般用第二种#}
{# novalidate选项阻止浏览器私自给我做校验 #} {% csrf_token %}
{
{ login_form.user }}
{
{ login_form.errors.user.0 }}
{# 因为login_form.erros.user取出的是一个列表,所以需要加索引,因为模版语言的话,仅仅把能渲染出来的东西渲染出来 #}
{
{ login_form.pwd }}
{
{ login_form.errors.pwd.0 }}

 

 

 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标签中。

 

 

 

  

  

 详细信息

 

 

  

  

转载于:https://www.cnblogs.com/taozizainali/p/8982098.html

你可能感兴趣的文章
PHP 闭包函数 function use 使用方法实例
查看>>
因特网的IP协议是不可靠无连接的,那为什么当初不直接把它设计为可靠的?...
查看>>
iOS UI-QQ聊天布局
查看>>
Hadoop集群作业调度算法
查看>>
程序猿的思维修炼-读书笔记-思维导图
查看>>
osgi实战学习之路:3. osgi分层概念及相互合作demo
查看>>
如何很好的Review自己的代码
查看>>
Castle.Net 基本应用
查看>>
echarts 应用数个样例
查看>>
Kafka
查看>>
《4》CentOS7.0+OpenStack+kvm云平台部署—配置Nova
查看>>
LoadRunner测试WebService的3种方式
查看>>
SQL0294N 容器已在使用中。 SQLSTATE=42730
查看>>
Oracle数据库启动时:ORA-00119: invalid specification for system parameter LOCAL_LISTENER; ORA-00132错误解决...
查看>>
JS jQuery json日期格式问题的办法
查看>>
Python LOGGING使用方法
查看>>
Vi编辑器的使用
查看>>
Could not evaluate expression
查看>>
System.BadImageFormatException: 未能加载文件或程序集""或它的某一个依赖项。试图加载格式不正确的程序。...
查看>>
DOM基础
查看>>