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())
views.py
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),
]
urls.py
<!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>
login.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>
reg.gtml
<!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>
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文件

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

 

 

 

  

  

 详细信息

 

 

  

  

posted on 2018-05-02 19:45  睡觉的阿狸  阅读(265)  评论(0编辑  收藏  举报