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
    
    
  • 相关阅读:
    wikioi 1514 and ZJOI2006 书架
    HDU 4762 Cut the Cake(公式)
    HDU 4762 Cut the Cake(公式)
    呵呵,cnblog排名进4000了,留念一下!
    呵呵,cnblog排名进4000了,留念一下!
    电子书下载:C# Database Basics
    电子书下载:C# Database Basics
    (原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (Nios II) (SOPC Builder) (DE2-70)
    (原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (Nios II) (SOPC Builder) (DE2-70)
    部署GlusterFS及Heketi
  • 原文地址:https://www.cnblogs.com/klw1/p/11215767.html
Copyright © 2011-2022 走看看