基于期末项目数据工坊对于python的学习

什么是.pyc文件?

在看到codex写的项目里有很多__pycache__文件夹,里面有些二进制的.pyc文件,他是python运行.py文件时所编译的字节码文件,若源码无变动的情况下后续运行就无需二次编译,解释器会直接执行.pyc文件

python中的.是什么?

在pwn中总是会先io=remote(xxxx,xxxx)来连远程靶机,后续io.sendline(xxx)发payload,io.sendline是什么意思呢,也就是从io对象中取出它的sendline方法,python简单来说就是从左边的东西里面取出右边的东西

1
2
3
4
# Django 里也是同样的道理
request.user # 从 request 对象里取出user 属性
request.user.is_authenticated # 从 user 对象里取出 is_authenticated 属性
login(request, user) # 从导入的 django.contrib.auth 模块里取出 login 函数

那 django.contrib.auth.backends.ModelBackend 这串长的是什么?

就是文件路径用 . 表示。等价于:

django/contrib/auth/backends.py 里面的 class ModelBackend

初始化

先把环境弄好,启动虚拟环境,加入git管理

虚拟环境是独立于每一个项目的,所以会降低库之间的冲突问题,保证环境精准干净

.venv

创建并启用虚拟环境

1
2
3
4
cd E:\codex_project\python_class_project
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip

装库

1
pip install django==4.2 pandas numpy matplotlib openpyxl xlrd==2.0.1

固化依赖

1
pip freeze > requirements.txt

退出虚拟环境

1
deactivate

git

1
2
3
git init
git add .
git commit -m "xxx"

接下来要把vscode的python编译器切为我创建的虚拟环境

1
>Python: Select interpreter

选择到刚创建这个环境就好了

项目目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
python_class_project/
├── manage.py # Django 命令行入口
├── db.sqlite3 # SQLite 数据库文件(已生成)
├── config/ # Django 项目配置中心
│ ├── settings.py # 全局配置(核心!)
│ ├── urls.py # 根路由表(核心!)
│ ├── wsgi.py # WSGI 部署入口
│ └── asgi.py # ASGI 部署入口
├── apps/ # 业务模块(三个 app)
│ ├── accounts/ # 用户系统
│ │ ├── views.py # 登录/注册/登出视图(占位)
│ │ └── urls.py # accounts 路由
│ ├── workspace/ # 工作区
│ │ ├── views.py # 首页/仪表盘/工作区视图(占位)
│ │ └── urls.py # workspace 路由
│ └── analytics/ # 数据分析(预留)
├── templates/ # HTML 模板目录
│ ├── base.html # 母版页(所有页面继承它)
│ ├── accounts/
│ │ ├── login.html # 登录页(占位)
│ │ └── register.html # 注册页(占位)
│ └── workspace/
│ ├── home.html # 首页
│ ├── dashboard.html # 仪表盘(需登录)
│ ├── detail.html # 工作区详情(需登录)
│ └── analysis.html # 分析页(需登录)
├── static/
│ └── css/
│ └── theme.css # 暖色编辑风主题
├── media/ # 用户上传文件存储目录
├── docs/ # 项目文档
└── .venv/ # Python 虚拟环境

关键认识:config/ 是"大脑"(配置 + 路由总控),apps/ 是三个"功能模块",templates/ 是"脸面",static/ 是"衣服"。

Django的MTV架构

config里的url.py匹配到后是如何跳转到workspace里的url.py的path函数和include函数,rqender是怎么匹配到templates里的home.html的明明只写了部分路径,什么是HttpResponse

settings.py五大关键配置

1
2
3
4
5
6
7
8
9
10
问题1,首先config里的urls.py会接收到这个url然后使用path函数解析,解析前半部份然后跳转到workspace/urls.py匹配/adshboa
rd匹配上后调用dashboard_view函数来到了workspace/views.py调用dashboard_view,该函数使用render函数又来到/templates/workspace/dashboard.html调用模板,其中我之前疑惑的一点就是为什么没有写完整路径也能直接定位到模板,发现它是加入了django.contrib.auth,然后在settings.py的TEMPLATE中DIRS指定了baseDIR为templates,调用完view后html模板替换数据然后再经过css"穿衣服"就形成了我们看到的页面

问题2:STATIC_URL是指向的/static是程序员设置的静态数据,不会明显影响加载时间,MEDIA_ROOT指的是用户上传的文件放置的位置,是随用户使用动态增长的,会影响页面响应速度,加static是为了让页面运行更快

问题3:INSTALLED_APPS里注册的django.contrib.auth和django.contrib.sessions本质上是因为django是插件形的只有先注册django才会去扫描应用他们,然后去调用view或者urls这类脚本,他们的关系的话不太清楚

问题4:我觉得runsercver是把服务彻底拉起来然后放到我们指定的域名端口,它会启动django然后进而启动整个项目,然后migrate是用来初始数据库字段的,我们不是在django中定义了很多类来替代直接写sql吗,migrate就通过识别这些类建表添加字段,如果不执行migrate直接runserver就会导致没有数据库然后导致页面没有数据

问题5:这个问题有点卡壳,我觉得这个装饰器的作用是用来实现分用户的功能的,也就是说每个用户登录后都有一个自己的login然后通过匹配到这个login来对应具体的url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Phase 2 闭卷口述测验

▎ 共 5 题,满分 100 分,过关阈值 80 分。

---
Q1(20分):注册链路 + 密码哈希

从用户在注册页输入 用户名=bob, 密码=SafePass123! 点提交,到数据库 auth_user
表里出现一条新记录。请口述每一步发生了什么,并重点解释:(a) form.save() 对密码做了什么处理?(b)
为什么处理后的结果无法反推原始密码?

---
Q2(20分):登录链路 + Session

用户输入正确的用户名和密码提交登录。请从 form.is_valid() 开始,口述后续完整链路,包括:(a) authenticate()
怎么验证密码?(b) login() 在数据库和浏览器分别写了什么?(c) 用户刷新页面后,Django 怎么知道"这个人已经登录了"?

---
Q3(20分):CSRF 防护

请用"攻击者视角 → Django 防御视角"的方式:(a) 描述 CSRF 攻击的具体场景(攻击者怎么利用你已登录的状态?)(b) Django 的 {%
csrf_token %} 生成了什么?存在哪两个地方?(c) 提交 POST 时,Django 怎么决定放行还是 403?

---
Q4(20分):退出与注销

(a) 退出按钮为什么必须用 <form method="post"> 而不是 <a href="...">?(b) logout() 在数据库里做了什么操作?(c)
注销(deactivate)和退出(logout)有什么区别?注销后这个 User 还能不能重新登录?

---
Q5(20分):@login_required 与安全重定向

(a) 未登录访问 /dashboard/ 时,@login_required 做了什么?URL 里多了什么参数?(b) 攻击者如何利用 ?next=
参数进行钓鱼攻击?(c) get_safe_redirect 函数怎么判断一个 URL 是否安全?不安全的 URL 最后跳到哪里?

---
准备好了就开始作答。