importlib模块

使用 将需要导入的文件路径 放入 import_module() 里面 即可拿到该路径对应的文件 但是 只能识别到文件 不能识别到文件里的内容

path = 'bbs.apps'
import importlib
res = importlib.import_module(path)
print(res)
# <module 'bbs.apps' from 'C:\\Users\\ld_dragon\\Desktop\\项目\\BBS_project_12\\bbs\\apps.py'>

csrf跨站请求伪造

​ 引入:钓鱼网站: 通过制作一个跟正儿八经的网站一模一样的界面 骗取用户输入信息 修改数据去正儿八经的网站提交

 内部原理: 在让用户输入给对方转账的那个input框上做手脚 不给 这个input设置name和属性 在内部隐藏一个写好的name和 value属性input框 这个value就是 钓鱼网站受益人的账号 form表单数据提交 改为正儿八经的

 防止钓鱼网站的思路
   网站会给返回给用户的form表单页面 偷偷塞一个随机字符串
   请求到来的时候 会先比对随机字符串是否一致 如果不一致 直接拒绝(403)

​ 该随机字符串有以下特点
   1.同一个浏览器每一次访问都不一样
   2.不同浏览器绝对不会重复

form表单发送

form表单发送post请求的时候 需要你仅仅做的就是写一句话{{% csrf_token %}} 这样我们就可以吧 中间件的有个注释打开了 他这个就是来校验你有没有 一个 csrfmiddlewaretoken的东西 没有直接给你403

<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <input type="submit">
</form>
<input type="hidden" name="csrfmiddlewaretoken" value="rJ47FeK9T55wavvVJGY6UxdM1kTMHhTqotGfaXjXIK8Ahz2Uvs02yR9T8bBn5q2D">

ajax发送

1.先在页面上写{% csrf_token %}, 利用标签`属name性查找器 查找 获取到该input`键值信息

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

2.直接书写'{{ csrf_token }}' 一定要带引号

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

3.将获取随机键值对的方法写到一个js文件中 之后只需要导入文件即可 在static文件中创建 js文件 和 py文件 把下面代码写入 之后导入就行

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
  beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});

csrf装饰器

# cbv装饰器
from django.utils.decorators import method_decorator
# 模块的导入   csrf_exempt 不校验  csrf_protect 只校验
from django.views.decorators.csrf import csrf_exempt,csrf_protect

1.当你网站全局都需要校验csrf的时候 有几个不需要校验该如何处理?

如果是csrf_exempt 只有两种(只能给dispatch装)   特例
            @method_decorator(csrf_exempt,name='dispatch')  # 第二种可以不校验的方式
            class MyView(View):
                # @method_decorator(csrf_exempt)  # 第一种可以不校验的方式
                def dispatch(self, request, *args, **kwargs):
                    res = super().dispatch(request, *args, **kwargs)
                    return res

                def get(self,request):
                    return HttpResponse('get')

                def post(self,request):
                    return HttpResponse('post')

装饰器中只有csrf_exempt是特例,其他的装饰器在给CBV装饰的时候 都可以有三种方式

2.当你网站全局不校验csrf的时候 有几个需要校验又该如何处理?

如果是csrf_protect 那么有三种方式
# 第一种方式
# @method_decorator(csrf_protect,name='post')  # 有效的
class MyView(View):
    # 第三种方式
    # @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        res = super().dispatch(request, *args, **kwargs)
        return res

    def get(self,request):
        return HttpResponse('get')
    # 第二种方式
    # @method_decorator(csrf_protect)  # 有效的
    def post(self,request):
        return HttpResponse('post')

auth模块

​ 建议:在使用auth模块的时候 要用就用它的全套

如何创建超级用户(root)

python3 manage.py createsuperuser

创建用户

from django.contrib.auth.models import User
User.objects.create_user(username=username,password=password)  # 创建普通用户    密码自动加密
User.objects.create_superuser(username=username,password=password

校验用户名和密码是否正确

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

保存用户登录状态

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

判断当前用户是否登录

request.user.is_authenticated()

校验原密码是否正确

request.user.check_password(old_password)

修改密码

request.user.set_password(new_password)
request.user.save()  # 千万不要忘了

注销

auth.logout(request)

校验用户是否登录 装饰器

from django.contrib.auth.decorators import login_required
局部配置
@login_required(login_url='/login/')
def index(request):
    pass
全局配置
settings配置文件中 直接配置
LOGIN_URL = '/login/'
@login_required
def index(request):
    pass
# 如果全局配置了 局部也配置  以局部的为准

如何扩展auth_user表字段

利用一对一外键字段关系
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user = models.OneToOneField(to='User')
利用继承关系
from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
    phone = models.BigIntegerField()
    register_time = models.DateField(auto_now_add=True)

    # 一定要注意 还需要去配置文件中配置
    AUTH_USER_MODEL = 'app01.Userinfo'  # 应用名.表名
    # 这么写完之后 之前所有的auth模块功能全都以你写的表为准 

settings源码分析

在django中使用配置文件:

# 建议从conf中导入配置文件 而非直接导入该项目的配置文件
from django.conf import settings
# 还有个全局的
from django.conf import settings,global_settings

一个是暴露给用户可以配置的
一个是内部全局的(用户配置了就用用户的 用户没有配就用自己的)
# 先加载全局配置 给对象设置 然后在加载局部配置  再给对象设置 一旦有重复的项  后者覆盖前者
if __name__ == "__main__":
    # settings文件配置到环境变量
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "auth_learn.settings")

settings = LazySettings()

# global_settings就是一个django内部的全局配置文件
from django.conf import global_settings
class Settings(object):
    def __init__(self, settings_module):
        # 这句话就是遍历全局配置, 将所有的属性添加到settings对象中
        for setting in dir(global_settings):
            # 这里也说明了为什么属性需要大写
            if setting.isupper():
                setattr(self, setting, getattr(global_settings, setting))

        # store the settings module in case someone later cares
        self.SETTINGS_MODULE = settings_module
       # 这里就是动态的将我们用户的自定义配置文件模块导入
        mod = importlib.import_module(self.SETTINGS_MODULE)
        self._explicit_settings = set()
        # 遍历用户自定义配置文件
        for setting in dir(mod):
            # 如果我们配置的属性不是大写, 就会无效
            if setting.isupper():
                # 获取用户的配置属性
                setting_value = getattr(mod, setting)
                # 将我们配置的属性添加到settings配置文件中, 或者覆盖掉
                # Django默认的配置属性.
                setattr(self, setting, setting_value)
                self._explicit_settings.add(setting) 

django----csrf跨站请求伪造 auth组件 settings源码 importlib模块的更多相关文章

  1. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  2. Python菜鸟之路:Django CSRF跨站请求伪造

    前言 CSRF,Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对 ...

  3. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  4. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  5. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  6. [Django高级之中间件、csrf跨站请求伪造]

    [Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...

  7. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  8. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  9. Django框架(十六)-- 中间件、CSRF跨站请求伪造

    一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...

随机推荐

  1. AsyncDisplayKit编译和使用注意事项

    Facebook开源框架,在github上可下载到.首先要编译AsyncDisplayKit库项目,有可能会出现下面错误: cocoaPods是基于ruby的项目版本控制软件,如果是ruby新手就会不 ...

  2. Docker基础与实战,看这一篇就够了

    docker 基础 什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Uni ...

  3. H3C交换机console登录配置 v7

    一.通过con口只需输入password登陆交换机. [H3C]user-interface aux 0 设置认证方式为密码验证方式 [H3C-ui-aux0] authentication-mode ...

  4. Python3 之 类属性与实例属性

    1.类属性与实例属性 类属性就相当与全局变量,实例对象共有的属性,实例对象的属性为实例对象自己私有. 类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存 ...

  5. 2019-10-9:渗透测试,基础学习,php文件上传,mysql基础

    header("Content-Type:text/html;charst="utf-8")设置头部信息,解决编码问题setcookie("loginStrin ...

  6. day 26 面向对象知识网

    1. 成员 - 变量 - 静态字段,类变量 - 方法 - 类方法 - 静态方法 - 实例方法 - 属性2. 对象的嵌套3. 特殊方法 __init__ new call getitem... add ...

  7. Python爬虫之Selenium的常用方法

    1.单个元素的选取 find_element_by_id      通过标签属性Id查找元素 find_element_by_name      通过标签属性name查找元素 find_element ...

  8. Java基础面试题及答案(六)

    异常 74. throw 和 throws 的区别? throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理.而throw则是 ...

  9. node_export 安装

    目录 安装部署 环境准备 下载安装 启动测试 安装部署 环境准备 主机名 角色 IP 系统版本 内核版本 es01.k8s.com node01 10.0.20.11 CentOS 7.5 5.1.4 ...

  10. Prometheus 自动发现

    目录 简介 环境说明 静态配置 重新加载配置文件 基于文件发现配置 重新加载配置文件 添加主机测试 基于DNS的A记录 修改配置文件 重新加载配置文件 基于DNS的SRV记录自动发现 修改配置文件 重 ...