第63天-django学习(十二)

补充模块importlib

介绍

importlib模块是Python中用于动态加载和导入模块的内置模块。它提供了一组函数和类,使得我们可以在运行时根据需要加载模块,并且可以对已导入的模块进行操作和管理。

动态加载模块

python 复制代码
# 导入模块 : 动态加载一个模块
import importlib
​
# 定义模块的名字
module_name = 'math'
# 动态导入模块
math_module = importlib.import_module(module_name)

导入指定模块成员

python 复制代码
# 导入模块 : 动态加载一个模块
import importlib
​
# 定义模块的名字
module_name = 'math'
# 动态导入模块
math_module = importlib.import_module(module_name)
# 从模块中获取相关的值
sqrt_func = getattr(math_module, 'sqrt')
print(sqrt_func) # <built-in function sqrt>

重新加载模块

python 复制代码
import importlib
​
# 要重新加载的模块名
module_name = 'my_module'
​
# 加载模块
my_module = importlib.import_module(module_name)
​
# 重新加载模块
my_module = importlib.reload(my_module)

获取已导入的模块列表

python 复制代码
import sys
​
for module_name, module in sys.modules.items():
    print(module_name, module)

CSRF跨域请求伪造

介绍

CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。

攻击者通过诱导受害者访问恶意网站或点击恶意链接

  • 将恶意请求发送到目标网站上

  • 利用受害者在目标网站中已登录的身份来执行某些操作

  • 从而达到攻击的目的。

要保护自己免受CSRF攻击,网站开发者可以采取以下措施:

  • 使用CSRF令牌: - 在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。 - 每次提交请求时都会验证该令牌,以确保请求是合法的。 - 启用SameSite属性: - 将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。 - 这可以在一定程度上缓解CSRF攻击。 - 严格验证请求来源: - 服务器端可以验证请求的来源是否为预期的网站域名 - 例如检查HTTP Referer头部。 - 使用验证码: - 在敏感操作(如转账、更改密码等)上使用验证码 - 增加用户身份验证的防护。

正常服务端

页面

html 复制代码
<h1>这是正规的网站</h1>
​
<form action="" method="post">
    <p>当前账户 :>>>> <input type="text" name="start_user"></p>
    <p>目标账户 :>>>> <input type="text" name="end_user"></p>
    <p>转账金额 :>>>> <input type="text" name="money"></p>
    <input type="submit">
</form>

视图函数

python 复制代码
def transform_normal(request):
    if request.method == "POST":
        user_start = request.POST.get("start_user")
        user_end = request.POST.get("end_user")
        money = request.POST.get("money")
        return HttpResponse(f"当前账户 :>>> {user_start} 向目标用户 :>>> {user_end} 转账了 :>>> {money}")
    return render(request, 'transform_normal.html')

钓鱼服务端

页面

html 复制代码
<h1>这是钓鱼的网站</h1>
​
<form action="http://127.0.0.1:8000/transform_normal/" method="post">
    <p>当前账户 :>>>> <input type="text" name="start_user" ></p>
    <p>目标账户 :>>>> <input type="text"></p>
    <p><input type="text" name="end_user" value="Hopes" style="display: none"></p>
    <p>转账金额 :>>>> <input type="text" name="money"></p>
    <input type="submit">
</form>

视图函数

python 复制代码
def transform_normal(request):
    return render(request, 'transform_normal.html')

crsf校验

form表单校验
html 复制代码
<form action="" method="post">
{% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>transfer_user<input type="password" name="password"></p>
    <p>money<input type="text" name="money"></p>
    <input type="submit">
</form>
ajax校验
html 复制代码
<button id="b1">ajax请求提交</button>
​
<script>
    $("#b1").click(function () {
        $.ajax({
            url: '',
            type: 'post',
            // (2) 利用模板语法提供的快捷书写
            data: {"username": "dream", 
                   "csrfmiddlewaretoken": "{{ csrf_token }}"},
            success: function () {
            }
        })
    })
</script>

Auth模块

引入

复制代码
    我们在创建一个Django项目之后,直接执行数据库迁移命令会自动生成很多表,其中有:
    django_session、uth_user两张表。
    jango在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且必须是管理员用户才能进入

创建超级用户(管理员)

html 复制代码
python3 manage.py createsuperuser

依赖于auth_user表完成登录注册功能

页面

html 复制代码
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit" class="btn btn-success">
</form>

视图函数

python 复制代码
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = auth.authenticate(request, username=username, password=password)
        print(user_obj) 
        print(user_obj.username) 
        print(user_obj.password)  
        print(user_obj) 
​
    return render(request, 'login.html')
相关推荐
dengqingrui1235 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
我的心永远是冰冰哒5 小时前
ad.concat()学习
学习
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
slomay7 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
hengzhepa7 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
vvvae12348 小时前
分布式数据库
数据库
雪域迷影8 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
bug菌¹9 小时前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
逸巽散人9 小时前
SQL基础教程
数据库·sql·oracle
小小洋洋9 小时前
BLE MESH学习1-基于沁恒CH582学习
学习