zoukankan      html  css  js  c++  java
  • day-65Django

    auth模块

    准备工作:

      1,在使用Django_admin的时候,

      需要有auth_user表,所以需要执行用表模型生成表的那两个操作命令,不然没有auth_user表,然后用操作命令来注册

      2.接着自己项目的注册登录..,使用的是Django_admin自带的auth_user表
      由于auth_user表models里面并没有表模型,所以需要使用auth模块,来对数据库auth_user表的操作

    from django.shortcuts import render, HttpResponse
    from django.contrib import auth
    
    登录验证
    
    def login(request):
        if request.method == 'GET':
            return  render(request, "login.html")
        else:
            username = request.POST.get('username')
            pwd = request.POST.get('pwd')
    
            user_obj = auth.authenticate(request, username=username, password=pwd)      #password,password是auth_user表中的key,这个操作是来判断用户名,密码是否和auth_user表中数据一致
                                                                                        #如果一致返回user_obj这个类,不一致返回null                                                                                 
                                                                                        # 相当于 :models.AuthUser.objects.filter(username=username, password=pwd)
             print(user_obj.username, user_obj.password)                                #user_obj是一个类,可以有通过点方法来获得auth_user表里面的用户名,密码..数据
        
    
            if user_obj:
             
                
                auth.login(request,user=user_obj)                                        #这句话相当于完成下面操作:  
                
                                                                                         #1. 向客户端写cookiie
                                                                                         #2. 向session表写session数据
                                                                                         #3. 生成了一个request.user(相当于request.session,在视图函数中使用)
                                                                                         #后面可以点出来request.user.username, request.user.password,                                                                                           
                                                                                         #以及session表中所有数据都能点出来        
                return HttpResponse('ok')
            else:
                return render(request, "login.html")
                
                
    
    函数视图cookie验证
    def index(request):
      
         username = request.user.username                                                # 第一种判断用户是否登录
        
       
        is_login = request.user.is_authenticated()                                       # 第二种判断用户是否登录,返回bool类型
    
        if is_login:
            return HttpResponse('index')
        else:
            return render(request, "login.html")
            
            
            
            
    
    from django.contrib.auth.decorators import login_required
    
    @login_required (login_url='/login/')                                               # 第三种判断用户是否登录(如果登录走下面,没有跳转到'/login/'路由)
    def index2(request):
       return HttpResponse('index2')
       
    
    @login_required                                                                     # 第三种判断用户是否登录的衍生
    def index3(request):                               
        return HttpResponse('index3')
    
    #settings文件中
    STATIC_URL='/STATIC/'
    
    LOGIN_URL='/LOGIN/'

     其他功能的使用:

    from django.contrib.auth.models import User                                     #User就是auth_user这个表的表模型类
    注册
    def register(request):
        if  request.method == 'GET':
            return render(request, 'register.html')
        else:
            username = request.POST.get('username')
            pwd = request.POST.get('pwd')
    
           
            User.objects.create_superuser(username=username, password=pwd,  email='111@qq.com')     #创建管理员
            User.objects.create_user(username=username, password=pwd)                               #创建普通用户
            #相当于: User.objects.create(username=username, password=pwd)
            
            return HttpResponse('successs')
    
    修改密码
    def modify(request):
        if request.method == 'GET': 
            return render(request, 'modify.html')
        else:                                                       #登录成功才能修改密码
    
            old_pwd = request.POST.get('old_pwd')
    
            res = request.user.check_password(old_pwd)              #在session表中验证老密码,返回的是bool
            if res:
                new_pwd = request.POST.get('new_pwd')
                
                request.user.set_password(new_pwd)                  #设置新密码后,auth_user中的密码会改变,session表中的密码也会改变
                                                              
                request.user.save()                             
    
                return HttpResponse('ok')
                
    安全退出(注销)            
    def logout(request):                                            # 删除session
    
        auth.logout(request)
        return HttpResponse('安全退出')

     auth_user表添加新的列:

    auth_user表添加列:
    
                    - 一对一关联(不推荐)
    
                
                      from django.contrib.auth.models import User
                      
                      class UserDetail(models.Models):
                        phone = models.CharField(max_length=11)         #要添加的列
                        user = models.OnoToOneField(to=User)            #一对一关联User表
                    
    
                    - 面向对象的继承(用继承重写User表)
                    
                        from django.contrib.auth.models import User,AbstractUser
                        class UserInfo(AbstractUser):                           #数据库auth_user表变成app01_UserInfo这张表,并且auth模块同样适用这张表
                          phone = models.CharField(max_length=32)               #要添加的列
    
                        
                        #settings文件中                                         # 需要在配置文件中,指定我不再使用默认的auth_user表而是使用我自己创建的Userinfo表
                        STATIC_URL='/STATIC/'           
                        
                        AUTH_USER_MODEL = "app01.UserInfo"                      #app名.models里面对应的模型表名

    补充:related_name之反向查询起别名

    一对多当中:

    models


    from
    django.db import models # Create your models here. class UserType(models.Model): title = models.CharField(max_length=32,null=True) class UserInfo(models.Model): username = models.CharField(max_length=32, null=True) age = models.CharField(max_length=32, null=True) ut = models.ForeignKey("UserType", null=True, related_name='xxx') #加在外键

    views

    from app01 import models
    def test110(request):
    
        ##################### 一对多 关系  #############
        # 正向查询
         res = models.UserInfo.objects.filter(username='小猴').first()
         print(res.ut.title)
    
        # 反向查询
        #传统方式(表明小写_set.all())
         res = models.UserType.objects.filter(id=2).first()
         print(res.userinfo_set.all())
    
        ### 现代方式(releate_name = 'xxx')     
         res = models.UserType.objects.filter(id=2).first()
         print(res.xxx.all())                               #xxx相当于userinfo_set,但取名需要见名而义
        
        return HttpResponse('ok')

    多对多当中:

    modles

    class Boy(models.Model):
        name = models.CharField(max_length=32, null=True)
    
    class Girl(models.Model):
        name = models.CharField(max_length=32, null=True)
    
    class Boy2Girl(models.Model):
        b = models.ForeignKey("Boy", null=True, related_name='xxx') 
        g = models.ForeignKey("Girl", null=True, related_name='yyy')

    views

    from app01 import models
    def test110(request):
    
        ###############  多对多 #############
        # 创传统方式(表名小写_set)
         res = models.Boy.objects.filter(name='gouyang').first()
         b2g = res.boy2girl_set.all()
         for obj in b2g:
             print(obj.g.name)
    
        # 现代方式:
         res = models.Boy.objects.filter(name='gouyang').first()
         b2g = res.xxx.all()                            #先用xxx(找男生)找到 Boy2Girl表中的'gouyang'对应的对象,反之找女生用yyy
         for obj in b2g:
             print(obj.g.name
             
         return HttpResponse('ok')

     

     多对多自关联

    使用原因:

      因为boy和girl字段基本相同, 因此可以写在一张表中, 通过gender来进行区分

    自己写第三张表:

    class User(models.Model):                           #自己关联自己
        name = models.CharField(max_length=32, null=True)
        gender_choice = (
            (1,''),
            (2,''),
        )
        gender = models.IntegerField(choices=gender_choice, null=True)
      
    
    class U2U(models.Model):
        b = models.ForeignKey("User", null=True, related_name='xxx')       #b代表男(前提表的写法自己规定好)
        g = models.ForeignKey("User", null=True, related_name='yyy')       #g代表女(前提表的写法自己规定好)
    # 查询和勾洋约会的女生
         res = models.User.objects.filter(name='罗文', gender=1).first()
         objs = res.xxx.all()                                      #反向查询,相当于: select * from app01_u2u where b_id=2
         for obj in objs:
             print(obj.g.name)
    
        # 和蓉蓉约会的男生
         res = models.User.objects.filter(name='蓉蓉', gender=2).first()
         objs = res.yyy.all()
         for obj in objs:
             print(obj.b.name)

     

    不写第三张表: 

    需要自己定义的规则:
       from_user_id(第三张表得到列名) : 男生id
       to_user_id :(第三张表的列名): 女生

    class User(models.Model):
        name = models.CharField(max_length=32, null=True)
        gender_choice = (
            (1,''),
            (2,''),
        )
        gender = models.IntegerField(choices=gender_choice, null=True)
        m = models.ManyToManyField("User")
     #和罗文约会的女生
        res = models.User.objects.filter(name='罗文', gender=1).first()
        objs = res.m.all()   
        
        #用男生的名字根据第三张表查到自己表中约会的女生的对象
        #先查的是这个列名from_user_id
        '''
            相当于:
            1. seelct to_user_id from app01_user_m where  from_user_id=2    ====>  5,6
            2. select * from app01_user where id in [5,6]             # 找到所有相亲女生
        '''
        for obj in objs:
            print(obj.name)
            
    
        #和品如约会的男生;
        res = models.User.objects.filter(name='品如', gender=2).first()
        objs = res.user_set.all()       
        #表名小写_set  
        #先查这个列名to_user_id
    
        '''
            相当于:
            1. seelct from_user_id from app01_user_m where  to_user_id=6   ===  >1,2 
            2. select * from app01_user where id in [1,2]
        '''
    
        for obj in objs:
            print(obj.name)

     一对多自关联

    class Comment(models.Model):
    
        news_id = models.CharField(max_length=32)
        content = models.CharField(max_length=128)
        reply_id = models.ForeignKey("Comment")          #关联的是自己的id

    如下:

    news(新闻表): 
            
                    新闻内容
                id   content
            
            comment(评论表):
            
                        新闻id      评论内容     评论表的id         #代表评论内容时给哪个评论内容留言
                id     news_id      content      reply_id
            
                1        1           别逼逼        null
                2        1           就逼逼        null            #没人评论默认null
                3        1           瞎比比        null
                4        2           xxxxxx        null
                5        1           kkkkkk         2
                6        1           llllll         1
                
            显示效果:
            
                第一条新闻:
                
                    - 别逼逼
                        - llllll
                    
                    - 就逼逼
                        - kkkkkk
                    - 瞎比比
                
                
                第二条新闻:
                    - xxxxxx  
                        

    ps:

            
            第一种对表的添加:
                models.Boy2Girl.objects.create(b_id=1, g_id=4)

        第二种对表的添加: boy_obj
    = models.Boy.objects.filter(name='gouyang').first()            #拿到对象 girl_obj = models.Girl.objects.filter(name='秀琴').first() models.Boy2Girl.objects.create(b=boy_obj, g=girl_obj)                #模型表外键名=对象相当于b_id=1,g_id=4
    
    
  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/klw1/p/11215767.html
Copyright © 2011-2022 走看看