1.小知识
实现 content 修改
import requests
url = 'http://www.xiyou.edu.cn' 西邮官网
response = requests.get(url)
text = response.content.decode('utf8')
text = text.replace('西安邮电大学', '屈哥')
print(text)
开发工具上展示
结果
<TITLE>屈哥</TITLE><META Name="keywords" Content="屈哥" />
其中一条展示
特别强调: text 与 content 推荐使用 content, 因为它是固定格式
2.Mitmproxy
实现代理服务器
访问流程: 客户端----代理服务器----服务器
浏览器发起请求----代理捕获、修改请求----服务器接收请求----服务器返回响应----代理捕获、修改响应----返回浏览器响应
一个提供Python接口的HTTP监控、拦截工具
其中包括 mitmproxy, mitmdump, mitmweb三个
因为 mitmproxy不支持Windows, 所以不介绍它
总流程如下
1.pip install mitmproxy==4.0.4
2.设置浏览器为代理服务器,代理地址为本机IP地址,端口默认8080
3.申请ca认证证书-----允许拦截、访问HTTPS请求
1.mitmweb------提供Web前端显示亦可手动修改响应
mitmweb 开启监听端口,默认为8080
打开浏览器看到弹出页面如下
其中第二行 intercept 处填写需要拦截的请求 url
下面空白处显示监视的请求,点开一个后,点击 Resume表示允许HTTP请求和响应通过,右边可编辑保存,后在浏览器可看到修改后的响应
2.mitmdump------命令行显示亦可执行Python脚本修改响应
mitmdump 开启监听端口
mitmdump -s xxx.py 执行当前目录下的Python测试脚本
我现在要修改响应头及响应内容
import mitmproxy.http
# 修改响应固定函数名
def response(flow: mitmproxy.http.HTTPFlow):
"""
content 表示二进制内容
pretty_url 表示被拦截的请求地址
"""
if flow.request.pretty_url == 'http://www.xiyou.edu.cn/':
flow.response.headers['name'] = "haha"
flow.response.content = flow.response.content.decode('utf8').replace('西安邮电大学', '屈帅').encode('utf8')
浏览器 F12后F5 即可查看结果
注意: 只修改此地址响应,其他图片、静态文件响应不做修改
3.Mitmdump与Django结合
在 script.py中添加配置
将数据库与代理监控结合使用
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "exam.settings")
django.setup()
import mitmproxy.http
from flow.models import User
def response(flow: mitmproxy.http.HTTPFlow):
"""
content 表示二进制内容
pretty_url 表示请求地址
"""
if User.objects.filter(username='lll'):
if flow.request.pretty_url == 'http://www.xiyou.edu.cn/':
flow.response.headers['name'] = "haha"
flow.response.content = flow.response.content.decode('utf8').replace('西安邮电大学', '屈帅').encode('utf8')
当数据库查询满足后才会进行拦截修改
4.Django的COOKIES
当访问流程中的下一个路由函数需要上个函数的参数时
设置cookie传参
设置后所有视图函数都能获取
def early(request):
username = request.POST.get(username, '')
response = render(request, 'test.html')
或 redirect('/xxx/xxx/xx路由/')
response.set_cookie('username', username)
return response
def later(request):
username = request.COOKIES.get('username')
获得传递的参数
set_cookie 方法,可以使浏览器的请求头和响应头保存 cookie 内容,
浏览器开发者工具可看到;
多次访问依然可以看到,亦可以设置过期时间,关闭浏览器则 cookie 消失
5.Django的Session
类似于cookies,所有视图函数都能获取,不过方法不同
设置 request.session['name'] = 'li'
获取 value = request.session.get(name)
同时Django的自带数据库 django_session 会有记录保存
可设置过期时间,默认为14天