定义RequestResponse和Url类

Posted wd404

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了定义RequestResponse和Url类相关的知识,希望对你有一定的参考价值。

1、介绍

定义Request、Response和Url类分别用于管理http请求、响应和url的数据与方法。

这三个类所对应的数据和方法,在渗透测试业务中应用非常广泛,同时存在高度的定制化需求,比如Request的id对象属性、send_time和wait_time对象属性等。

而同时,requests模块、mitmporxy模块等所使用的这三个类,要么比较封闭不支持外部引用,要么提供的属性和方法简陋、体验不佳。

综合来看,定义这三个类,是非常有必要的。能够高度定制与优化,且方便掌握。

2、Request类

编程规范之一:通过属性持有变量和方法,比直接继承属性和方法更好。

结合需求来说,就是Request和Response的共同需求主要是集中在头部处理。但不建议定义父类,来进行头部操作。而是分别基于头部对象Headers()实现操作。

而除了头部操作,Request和Response几乎没有必要再定义父类。

2.1 类初始化方法

def __init__(self, url: str = \'\', https_flag: bool = False, message: str = \'\'):
  • 定义了两类设置方法:url和请求报文
  • url,str类型。如果使用,则其包括协议在内的url
  • https_flag,bool类型。表示请求报文的协议是否为https
  • message,str类型。完整的请求报文。解析前会替换\\r为空字符串

2.2 对象属性

# 请求方法,默认是get
self.method = \'GET\'
# 协议版本
self.protocol_version = \'HTTP/1.1\'
# 请求头部,至少有host这个头部字段。
self.headers = Headers()
# 请求体部
self.body = \'\'
# url,主要是包含协议部分。
self.url = \'\'
# 编号,默认为-1,从1开始递增
self.id = -1
# 请求的发送时间,格式是20230423 10:00:00
self.send_time = \'\'
# 响应时延,float类型,单位是秒
self.wait_time = -1
# 响应对象
self.res = None

2.3 方法

(1)send

def send(self, timeout: float = None, d: dict = None):
  • 发送请求
  • timeout,float类型,设置如果发送之后多长时间未接收到响应会报异常,单位为秒。
    • 实际上,该参数是作为requests.request函数的参数,而产生作用。
    • 对于requests.request函数,timeout参数如果设置为0或负数,并不会发出请求,而是直接报异常,没有意义。而如果设置为None,则表示一直等待响应
    • 所以,在本方法中,会预先判断timeout如果是小于等于0,则转为None值
  • d,dict类型,即请求头部。其作用是设置固有的头部字段,以覆盖临时的请求头部字段。常用于user-agent
  • 该方法,实际上是调用requests.request函数执行请求,将响应结果通过Response类转化,并记录请求过程相关数据,包括send_time和wait_time等
  • 方法执行过程中,会将请求的实际头部重新赋值给给请求的头部headers对象

(2)get_message

def get_message(self):
    """get_message()->str"""
  • 获取请求报文
  • 值得注意的是,请求头部为空时的换行情况,虽然不可能出现头部为空,至少有host字段 

(3)clone

def clone(self):
    """clone() -> Request""
  • 克隆、且为深度克隆,返回Request对象
  • 只克隆请求状态相关的属性,而包括响应在内的其它属性为初始值。该方法主要用于渗透测试时,重复性测试,或者在样本基础上更改url、请求头部、请求体部中某一部分的测试
  • headers也被深度克隆,即克隆对象操作headers属性不影响被克隆对象

3、Response类

3.1 类初始方法

def __init__(self, res=None):
  • res为None,表示不是直接解析,而是手动为响应的各属性赋值
  • res为str,且不为空字符串,则是读取日志进行解析
  • res为requests.Resposne对象,即对requests.request函数执行结果进行解析,封装为自定义Response对象

3.2 对象属性

# 协议/版本
self.protocol_version = \'HTTP/1.1\'
# 响应状态码
self.status_code = \'\'
# 响应状态描述符
self.reason = \'\'
# 响应头部字段
self.headers = Headers()
# 响应体部
self.body = \'\'

3.3 方法

def get_message(self):
    """get_message() -> str"""
  • 获取请求报文
  • 值得注意的是,请求头部为空时的换行情况,此时处理为响应行与响应体部之间\\n\\n分隔

4、Url类

4.1 类初始化方法

def __init__(self, string=\'\'):
  • 为空字符串,表示不是直接解析,而是手动为url的各属性赋值
  • 不为空字符串,则进行url解析

4.2 对象属性

# 协议名称,一般为http://或https://
self.schema = \'\'
# 主机名称,可能包含用户名和密码部分,可能是ip、域名或者是localhost
self.hostname = \'\'
# 端口,可能不存在。如果存在,为:8080形式
self.port = \'\'
# 路径,可能不存在。如果存在,为/a/b/c形式
self.path = \'\'
# 直接参数,可能不存在。如果存在,为?name=&password=形式
self.query = \'\'
# hash部分,可能不存在。如果存在,为#123456形式
self.fragment = \'\'

4.3 方法

def set_url(self, args):
def toString(self):
def clone(self):
def address_arr(self):

 

django 使用一个 url 运行自定义视图类方法

【中文标题】django 使用一个 url 运行自定义视图类方法【英文标题】:django run custom views class method with one url 【发布时间】:2020-06-10 19:32:11 【问题描述】:

我是 Django 新手。我想使用视图文件中的自定义方法来管理我的数据库。例如,我有这段代码我想用 javascript 运行 - 我写了这段代码:

Js:

$.ajax(
        type: 'POST',
        url: '/ClassManager/',
        data: 
            data: data,
            csrfmiddlewaretoken: csrftoken,
        ,
        success: function() 
            alert("IT WORKED")
        ,
        error: function() 
            alert('error');
        
    )

views.py

def expfunc():
    if request.method == 'POST':
            user = User.objects.get(pk=1)
            addlst = List(content = "list content", creator = user)
            addlst.save()

urls.py

urlpatterns = [
    path('ClassManager/', views.expfunc),
]

现在,问题是,对于我想在 views.py 中创建的每个新函数,我都需要在 urls.py 中添加另一行。

我的问题是 - 是否有办法使用所有自定义方法创建一个类,并使用一个 url 和不同的数据访问它们?

例如:

Js:

$.ajax(
        type: 'POST',
        url: '/ClassManager/functionone()',
        data: 
            data: data
            csrfmiddlewaretoken: csrftoken,
        ,
        success: function() 
            alert("IT WORKED")
        ,
        error: function() 
            alert('error');
        
    )

views.py

class DatabaseManager():
    def functionone(): # add new list
        if request.method == 'POST':
                user = User.objects.get(pk=1)
                addlst = List(content = "list content", creator = user)
                addlst.save()
    def functwo(): # update username
        if request.method == 'POST':
                user = User.objects.get(pk=1)
                user.id = 9
                user.save()
    def functhree(): # update list content
        if request.method == 'POST':
                user = User.objects.get(pk=1)
                mylist = List.objects.get(pk=1)
                mylist.content = "updated list content"
                mylist.save()

urls.py

urlpatterns = [
    path('ClassManager/functionone()', views.DatabaseManager.functionone),
]

我来自 asp.net 背景,在那里我编写了带有运行查询的函数的类,以及我如何管理我的数据库,所以我可以在这里做同样的事情吗?

提前致谢!

【问题讨论】:

【参考方案1】:

您可以使用Class Based View 将您的视图实现为 Python 对象而不是函数,但您不能使用 Ajax 调用类函数。

【讨论】:

基于类的视图只有 8 个我可以使用的特定方法...我无法创建自定义方法,我仍然需要在 urls.py 中为每个方法添加新行。这是你在 django 中编码的方式吗?对于每个视图方法,我需要在 urls.py 中添加新行吗?正如我所说:我是 django 的新手。 tysm 是的!您需要为每个视图添加一个 url 好的,谢谢!最后一个问题,如果我可以的话:你知道只有一个 url 和多个自定义函数来获得相同结果的任何其他方法吗?

以上是关于定义RequestResponse和Url类的主要内容,如果未能解决你的问题,请参考以下文章

RequestResponse简介

爬虫页面

day03-java web之requestresponse

LoadRunner获取WEB请求头信息的方法:REQUESTRESPONSE(引)

用Python写简单的爬虫

C# 自定义的针对URL地址的处理类