• Day 59 Django auth模块/插拔式设计/csrf_token


    Django auth模块

    命令行创建超级用户

    python manage.py createsuperuser
    

    auth模块常用方法

    1. 创建用户

    from django.contrib.auth.models import User
    
    # User.objects.create(username=username,password=password)  # 不可用  密码不是加密的
    # User.objects.create_user(username=username,password=password)  # 创建普通用户    密码自动加密
    User.objects.create_superuser(username=username, password=password, email='lsewj@126.com')
    

    2. 校验用户登录状态

    from django.contrib import auth
    
    # res = User.objects.filter(username=username,password=password)  # 密码无法校验
    from django.contrib import auth
    # 必须传用户名和密码两个参数缺一不能
    user_obj = auth.authenticate(request,username=username,password=password)
    

    3. 保存用户登录状态

    auth.login(request, user_obj)
    # 只要这句话执行了 后面在任意位置 只要你能拿到request你就可以通过request.user获取到当前登录的用户对象,加了sessionid
    

    4. 判断当前用户是否登录

    request.user.is_authenticated()
    

    5. 校验原密码是否正确

    request.user.check_password(old_password)
    

    6. 修改密码

    request.user.set_password(new_password)
    # 一定要保存
    request.user.save()
    

    7. 注销

    auth.logout(request)
    

    8. 校验用户是否登录的装饰器

    from django.contrib.auth.decorators import login_required
    # 局部配置
    @login_required(login_url='/login/')
    def logout(request):
        auth.logout(request)
        return HttpResponse('注销成功')
    
    # 全局配置
    # 首先在settings.py文件中直接配置LOGIN_URL = '/login/'
    @ login_required
    def logout(request):
        auth.logout(request)
        return HttpResponse('注销成功')
    # 如果全局配置了,局部也配置了,那么以局部为准
    

    扩展auth_user表字段

    方式一

    利用一对一外键字段关系

    class UserDetail(models.Model):
        phone = models.CharField(max_length=32)
        user = models.OneToOneField(to='User')
    

    方式二

    利用继承关系

    在django.contrib.auth.models中有一个User类,它继承了AbstractUser类

    from django.contrib.auth.models import AbstractUser
    class Userinfo(AbstractUser):
        phone = models.BigIntegerField()
        register_time = models.DateField(auto_now_add=True)
    

    基于配置文件的插拔式设计

    # start.py
    import os
    import sys
    
    
    BASE_DIR = os.path.dirname(__file__)
    sys.path.append(BASE_DIR)
    
    if __name__ == '__main__':
        os.environ.setdefault('xxx', 'conf.settings')
        from lib.conf import settings
        print(settings.NAME)
    
    # __init__.py
    import importlib
    from lib.conf import global_settings
    import os
    
    class Settings(object):
        def __init__(self):
            for name in dir(global_settings):
                if name.isupper():
                    setattr(self, name, getattr(global_settings, name))
            module_path = os.environ.get('xxx')
          	md = importlib.import_module(module_path)
            for name in dir(md):
                if name.upper():
                    setattr(self, name, getattr(md, name))
    
    settings = Settings()
    

    csrf_token

    在post请求时会触发 CsrfViewMiddleware 中间件

    form表单post请求

    在form表单中加入{% csrf_token %}即可

    ajax中post请求

    方式一

    ​ 现在页面上书写{% csrf_token %}

    ​ 然后在发送ajax请求的时候,通过标签查找获取随机字符串添加到data自定义对象

    data:{'username': username, 'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()}
    

    方式二

    data:{'username': username, 'csrfmiddlewaretoken': '{{ csrf_token }}'}
    

    方式三 官网提供的文件

    ​ 直接新建js文件拷贝代码,导入即可

    csrf相关的装饰器

    csrf_exempt

    from django.views.decorators.csrf import csrf_exempt
    
    # 不校验csrf
    #@csrf_exempt
    def index(require):
        return HttpResponse('index')
    

    csrf_protect

    from django.views.decorators.csrf import csrf_protect
    
    # 只校验加装饰器的方法
    #@csrf_protect
    def index(require):
        return HttpResponse('index')
    

    FBV和CBV中csrf装饰器的区别

    csrf_exempt

    csrf_exempt这个装饰器只能给dispatch装才能生效

    @method_decorator(csrf_exempt, name='dispatch')
    class MyIndex(views.View):
        # @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request, *args, **kwargs)
        
        def get(self, request):
            pass
        
        def post(self, request):
            pass
    

    csrf_protect

    csrf_protect所有方式都可以

  • 相关阅读:
    mysql小白系列_04 datablock
    mysql小白系列_04 binlog(未完)
    mysql小白系列_03 体系结构-线程池
    mysql小白系列_02 mysql源码安装标准化
    国庆小长假来点不一样的,如何用Python爬取了全国近5000家旅游景点,一起来看
    python爬取p站排行榜并自动发送邮件-这个项目赚了500
    利用Azure backup备份和恢复Azure虚拟机(1)
    定制化Azure站点Java运行环境(5)
    定制化Azure站点Java运行环境(4)
    定制化Azure站点Java运行环境(3)
  • 原文地址:https://www.cnblogs.com/2222bai/p/12010954.html
Copyright © 2020-2023  润新知