• Django中auth登录、注册、修改密码、退出、ORM自关联


    登录

    from django.contrib import auth
    user_obj =  auth.authenticate(request, username=username, password=pwd)
    ## authenticate: 主要是从auth——user这张表中查询比较 数据, 返回一个user_obj对象
    if user_obj:
        ####设置session
        #### 登陆成功, 开始写session 的操作
        ### 1. 向客户端写cookiie
        ### 2. 向session表写session数据
        # request.session['username'] = username
         # request.session['pwd'] = pwd
    
        auth.login(request, user=user_obj)
    	作用:
    	1. 设置cookie, session
    	2. 生成request.user的对象, 这个对象可以再视图函数中使用 
    	3. request.user这个对象  相当于 request.session
    

    验证时否登录过

    方法一

    (1) username = request.sesssion.get('username')
    (2)username = request.user.username
    (3)request.path #获取url后缀
    (4)request.get_full_path() #获取后缀加get请求参数
    (1)(2)原理相同

    方法二

    is_login = request.user.is_authenticated()  ### 用户是否登录
    
        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/')
    def index2(request):
       return HttpResponse('index2')
    

    方法四(全局登录认证装饰器)

    setting:
    LOGIN_URL = '/login/' #需要跳转的页面
    
    代码区:
    from django.contrib.auth.decorators import login_required
    @login_required
    def index3(request):
        return HttpResponse('index3')
    
    

    注册

    from django.contrib.auth.models import 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(username=username, password=pwd)
            User.objects.create_superuser(username=username, password=pwd,  email='111@qq.com')
            User.objects.create_user(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)
            if res:
                new_pwd = request.POST.get('new_pwd')
                request.user.set_password(new_pwd)
                request.user.save()
    
                return HttpResponse('ok')
    

    安全退出

    def logout(request):
    
        auth.logout(request)
        return HttpResponse('安全退出')
    

    扩张auth_user表?

    - 一对一关联(不推荐)
    
    python
    from django.contrib.auth.models import User
    				  
     class UserDetail(models.Models):
    phone = models.CharField(max_length=11)
    user = models.OnoToOneField(to=User)
    

    auth继承

    from django.contrib.auth.models import User,AbstractUser
    class UserInfo(AbstractUser):
    phone = models.CharField(max_length=32)

    需要在配置文件中,指定我不再使用默认的auth_user表而是使用我自己创建的Userinfo表
    AUTH_USER_MODEL = "app名.models里面对应的模型表名"

    orm自关联

     自己写第三张表
    和勾洋约会的女生
     res = models.User.objects.filter(name='罗文', gender=1).first()
     objs = res.xxx.all()
    print(objs)
    
     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 : 女生id
    
     和罗文约会的女生
    res = models.User.objects.filter(name='罗文', gender=1).first()
    objs = res.m.all()
    
    1. seelct * from app01_user_m where  from_user_id=2 ## to_user_id:[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()
    
    1. seelct * from app01_user_m where  to_user_id=6 ## from_user_id:[1,2] 
    2. select * from app01_user where id in [1,2]
    
    for obj in objs:
    print(obj.name)
    
  • 相关阅读:
    HDU 1042 N!
    linux上安装wps办公软件
    《UNIX环境高级编程》笔记--环境变量
    【StatLearn】统计学习中knn算法实验(2)
    Asp.Net验证控件浅析
    斜率小于0的连线数量-归并排序
    Printk与sched_clock_init的一点分析
    【数字图像处理】使用kmeans算法对TrueColor图片进行优化
    将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
    python中os/sys/platform模块区别
  • 原文地址:https://www.cnblogs.com/huanghongzheng/p/11219144.html
Copyright © 2020-2023  润新知