zoukankan      html  css  js  c++  java
  • django 认证系统

    前提

    from django.contrib.auth.models import User
    from django.contrib import auth

    auth_user

    其中auth_user为django框架为我们提供用于存储登录用户和密码等信息的用户表,在我们使用此django认证系统时,必须使用此表,不可以另外创建用户表,且表中的内容不可以直接在表中添加,因为其存储密码为加密的的字符串。其中username和password字段是必须存入内容的字段。auth_user表格添加数据两种方式如下:

    方式一:(通过如下的命令添加超级用户信息)

    pyhton3 manage.py createsuperuser  # 其中username和password字段是必须存入内容的字段。

    方式二:

      通过create_user()或者create_superuser()(与上述创建超级用户效果一样)方法添加用户信息,如下注册用户函数的应用实例:

    def register(request):
        if request.method=="POST":
            username=request.POST.get("username")
            userpswd1=request.POST.get("userpswd1")
            userpswd2=request.POST.get("userpswd2")
            if userpswd1==userpswd2:
                User.objects.create_user(username=username,password=userpswd1)      #username和password为User表的关键字段
                return redirect("/login/")

    注意点:

    author模块方法

    authenticate()

      提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数,如果认证信息有效,会返回一个  user  对象。具体使用见如下登录函数实例:

    这里的pwd会经过加密再去数据库判断所以存在数据库的密码是加密后的密码

    from django.shortcuts import render,redirect
    
    from django.contrib import auth
    def log_in(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            # username,password是auth_user表的字段名
            # user,pwd 是用户填写的数据
            # 验证成功,返回user对象
            user = auth.authenticate(username=user,password=pwd)
            if user:  # 登陆成功
                # sesson写操作 相当于request.session["user"]=user.username
                auth.login(request,user)  # 需要传2个参数,request,和当前用户对象
                return redirect("/index/")
        return render(request,"login.html")

    login(HttpRequest, user)

      该函数接受一个HttpRequest对象,以及一个认证了的user对象,此函数使用django的session框架给某个已认证的用户附加上session id等信息。即上述登录实例中设置session用法。

    logout(request) 

      该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。如下注销当前登录用户的session实例:

    def login_out(request):
        auth.logout(request)           # 清除当前登录用户的session,相当于request.session.flush()
        return redirect("/login/")

     user对象方法

    is_authenticated()

      返回值为bool值,主要用于判断user对象是否完成登录验证,如用在要求用户登录以后才能访问某些网址,否则跳转到登录页面完成登录。见如下页面函数访问前的验证实例:(登录验证有两种方式

    # 登陆成功跳转
    def index(request):
        # 加验证,需要登陆
        print(request.user)  # jassin 取到当前的用户名
        print(type(request.user) ) # user是一个对象<class 'django.utils.functional.SimpleLazyObject'>
    
    # 方法1:验证有没有登陆
    #     if not request.user.id:  # 为空:没有用户登陆
    #         return redirect("/login/")
    
    
        # 方法二:返回fool值
        user = request.user
        if not user.is_authenticated()d():
            return redirect("/login/")
        return render(request,"index.html",locals())

    set_password()

      使用 set_password() 来修改密码,见如下修改密码函数实例:

    def modify(request):
        if request.method=="POST":
            username=request.POST.get("username")
            pre_userpswd=request.POST.get("pre_userpswd")
            new_userpswd=request.POST.get("new_userpswd")
            user=auth.authenticate(username=username,password=pre_userpswd)
            if user:
                user.set_password(new_userpswd)
                user.save()
                return redirect("/login/")

    create_user

    创建新用户,注册(数据库)

    实例

    from django.contrib.auth.models import User
    # 创建用户,注册
    # 注意点:存的时候,会先将密码加密后再存到数据库
    def reg(request):
        User.objects.create_user(username="lishi",password="1220")

     Django常用命令

    在django框架中常用的命令总结如下,注以下命令是在终端执行:

    # 查看django版本
    python -m django --version
    
    # 创建项目,名为mysite
    django-admin startproject mysite
    
    # Django项目环境终端
    python manage.py shell
    
    # 创建应用程序,确保和 manage.py 是同一目录
    python manage.py startapp app01
    
    # 启动django
    python manage.py runserver
    python manage.py runserver 8080
    python manage.py runserver 0.0.0.0:8000
    
    # 数据库迁移
    python manage.py makemigrations
    
    python manage.py migrate
    
    # 同步数据库
    python manage.py syncdb
    
    # 清空数据库(保留空表)
    python manage.py flush
    
    # 认证User表创建超级用户
    python manage.py createsuperuser
    
    # 修改用户密码
    python manage.py changepassword username

    small   demo(每个人都能进入index页面,看到的主页不同)

    views.py

    from django.shortcuts import render,redirect
    from django.contrib import auth
    from django.contrib.auth.models import User
    
    def log_in(request):
        if request.method == "POST":
            print("=================")
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            # username,password是auth_user表的字段名
            # user,pwd 是用户填写的数据
    
            # 验证成功,返回user对象, 否则返回None
            user = auth.authenticate(username=user,password=pwd)
            if user:  # 登陆成功
                # sesson写操作 相当于request.session["user"]=user.username
                auth.login(request,user)  # 需要传2个参数,request,和当前用户对象
                return redirect("/index/")
            else:
    
                return redirect("/index/")
        return render(request,"login.html")
    
    
    # 登陆成功跳转
    def index(request):
        # 加验证,需要登陆
        print(request.user)  # jassin 取到当前的用户名
        print(type(request.user) ) # user是一个对象<class 'django.utils.functional.SimpleLazyObject'>
    
    # 方法1:验证有没有登陆
    #     if not request.user.id:  # 为空:没有用户登陆
    #         return redirect("/login/")
    
    
        # 方法二:返回fool值
        # 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/")
    
    
    # 需要导入from django.contrib.auth.models import User
    # 创建用户,注册
    # 注意点:存的时候,会先将密码加密后再存到数据库
    def reg(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            User.objects.create_user(username=user,password=pwd)
            return redirect("/login/")
        return render(request,"reg.html")
    
    
    # 修改密码
    def modify(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pre_pwd = request.POST.get("pre_pwd")
            new_pwd = request.POST.get("new_pwd")
            user = auth.authenticate(username=user,password=pre_pwd)
            if user:# 符合原来用户的密码
                user.set_password(new_pwd)
                user.save()
                return redirect("/login/")

    修改页面:mdify.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>
    </head>
    <body>
    
    <form action="modify.html" method="post">
        {% csrf_token %}
        <p>用户名 <input type="text" name="user"></p>
        <p>密码 <input type="password" name="pwd"></p>
    <input type="submit">
        <a href="/login/">确定</a>
        </form>
    </body>
    </html>
    修改主页 modify
    <!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>
    <h3>this is INDEX </h3>
    <p>hello {{ user }}</p>
    
    {% if request.user.is_authenticated %}
        <a href="/logout/">注销</a>
        <a href="/modify/">修改密码</a>
        <h3>hell {{ request.user.username }}</h3>
    {% else %}
        <a href="/login/">登陆</a>
        <a href="/reg/">注册</a>
    {% endif %}
    </body>
    </html>
    index.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>
    </head>
    <body>
    <form action="login.html" method="post">
        {% csrf_token %}
        <p>用户名 <input type="text" name="user"></p>
        <p>密码 <input type="password" name="pwd"></p>
    <input type="submit">
        <button><a href="/reg/">注册</a></button>
        </form>
    </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>
    </head>
    <body>
    <h4>注册新用户页面</h4>
    <form action="reg.html/" method="post">
        {% csrf_token %}
        <p>用户名 <input type="text" name="user"></p>
        <p>密码 <input type="password" name="pwd"></p>
    <input type="submit">
        </form>
    </body>
    </html>
    注册页面

  • 相关阅读:
    工厂模式
    dubbo
    WebSocket WebService
    消息中间
    原型模式
    ApiPost Apifox
    Future 的使用与源码解析
    JUC 线程池的使用与源码解析
    ReentrantLock 源码解析
    CountDownLatch 的使用与源码解析
  • 原文地址:https://www.cnblogs.com/jassin-du/p/8401006.html
Copyright © 2011-2022 走看看