在 render_GET 或 render_POST 处理期间发布另一个 Web 查询

2024-01-04

我有一个使用 Twisted 编写的小型 Web 服务器。我想做的一件事是让它从另一个 Web 服务器返回结果作为加载页面的响应。也就是说,服务器 A 处对 render_GET() 的响应(通过http://A.com/resource http://A.com/resource)应该是服务器 B 上不同 URL 的内容(通过http://B.com/resource2 http://B.com/resource2)。服务器B返回的内容是动态的,所以我不能只缓存它。

现在,服务器 A 可以很好地渲染页面,只是无法渲染此远程资源。我尝试过使用 Agent(),但我似乎无法从 B 获得响应,更不用说将其转发给 A 了。我知道在某个地方我必须从 render_GET 中获取该请求,然后再进行处理write() and finish()它。这是在cbBody回调,它被调用但无法到达原始请求来填充它。

这是服务器 A 的资源处理程序的一段代码:

def render_GET(self,request):
    # try with canned content just to test the whole thing
    bmpServer = BMPServer(ServerBURL,
                          "xyzzy",
                          "plugh")
    d= bmpServer.postNotification({"a":123},request)
    print "Deferred", d
    return NOT_DONE_YET

这是服务器 A 上的其他代码:

theRequest = None

def cbRequest(response,args):
    print "response called"
    print response
    print args
    print 'Response version:', response.version
    print 'Response code:', response.code
    print 'Response phrase:', response.phrase
    print 'Response headers:'
    print pformat(list(response.headers.getAllRawHeaders()))  
    d = readBody(response)
    d.addCallback(cbBody)
    return d

def cbBody(body):
    print "Response body:"
    print body
    theRequest.write(body)
    theRequest.finish()
    theRequest = None

def cbError(failure):
    print type(failure.value), failure # catch error here
    print failure.value.reasons[0].printTraceback()

class BMPServer(object):
    def __init__(self,url,arg1,arg2):
        self.url = url
        self.arg1 = arg1
        self.arg2 = arg2

    def postNotification(self,message,request):
        theRequest = request
        bmpMessage = {'arg1':self.token,
                      'arg2':self.appID,
                      'message':message}
        print "Sending request to %s"%self.url

        print "Create agent"
        agent = Agent(reactor)
        print "create request deferred"
        print "url = %s" % self.url
        d = agent.request('POST', self.url,
                          Headers({'User-Agent': ['Twisted Web Client Example']}),
                          MessageProducer(bmpMessage))
        print "adding callback"
        d.addCallbacks(cbRequest,cbError)
        print "returning deferred"
        return d

当我将其作为独立代码运行时(在资源之外,使用react()例如),它工作得很好。但是,当我尝试将其包含在内(如上所示)时,它似乎从未收到数据。我已经运行了 WireShark,因此我可以看到从服务器 B 返回的响应,但数据从未显示在cbRequest().

例如,这是我看到的输出:

Sending request to http://localhost:8888/postMGCMNotificationService
Create agent
create request deferred
url = http://serverB:8888/postService
Message producer: body = {"arg2": "plugh", "arg1": "xyzzy", "message": {"a": 1}}
adding callback
returning deferred
testAgent: returning deferred
<Deferred at 0x10b54d290>
Writing body now
response called
<twisted.web._newclient.Response object at 0x1080753d0>
Response version: ('HTTP', 1, 1)
Response code: 200
Response phrase: OK
Response headers:
Response body:
{"result": false}
^CUnhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/Twisted-13.1.0_r39314-py2.7-macosx-10.8-intel.egg/twisted/web/_newclient.py", line 1151, in _bodyDataFinished_CONNECTED
    self._bodyProtocol.connectionLost(reason)
  File "/Library/Python/2.7/site-packages/Twisted-13.1.0_r39314-py2.7-macosx-10.8-intel.egg/twisted/web/client.py", line 1793, in connectionLost
    self.deferred.callback(b''.join(self.dataBuffer))
  File "/Library/Python/2.7/site-packages/Twisted-13.1.0_r39314-py2.7-macosx-10.8-intel.egg/twisted/internet/defer.py", line 382, in callback
    self._startRunCallbacks(result)
  File "/Library/Python/2.7/site-packages/Twisted-13.1.0_r39314-py2.7-macosx-10.8-intel.egg/twisted/internet/defer.py", line 490, in _startRunCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File "/Library/Python/2.7/site-packages/Twisted-13.1.0_r39314-py2.7-macosx-10.8-intel.egg/twisted/internet/defer.py", line 577, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "AServer.py", line 85, in cbBody
    print theRequest
exceptions.UnboundLocalError: local variable 'theRequest' referenced before assignment

再看一下,似乎如果我能找到一种方法将请求传递给cbBody()这一切都会很好。


您可以将额外的参数传递给回调Deferred:

d.addCallback(f, x)

当 d 触发时,结果是f(result of d, x)。您可以通过这种方式传递任意数量的位置参数或关键字参数。看API 文档Deferred https://twistedmatrix.com/documents/current/api/twisted.internet.defer.Deferred.html更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 render_GET 或 render_POST 处理期间发布另一个 Web 查询 的相关文章

  • 如何使用 Twisted 获取 IRC 频道的用户列表

    我正在尝试使用获取频道的用户列表 self say channel WHO 100 我怎样才能得到回复 我应该重写哪个方法 这里有一些额外的方法可以帮助您取得进一步的进展 您处理给定的回复RPL NAME通过定义一个方法irc RPL NA
  • 如何让我的简单扭曲代理工作?

    我正在尝试利用扭曲网框架 请注意三行注释 line1 line2 line3 我想创建一个代理 网关 它将根据 url 将请求转发到两个服务器之一 如果我取消注释 1 或 2 并注释其余部分 请求将被代理到正确的服务器 但是 当然 它不会根
  • Twisted Python:无法写入正在运行的生成进程

    我的问题是 在生成进程后 子进程正在循环以从其标准输入获取数据 我想使用 Echo Process pipes 0 write data 或 Echo Process writeToChild 0 data 向其写入新数据 但两者都不起作用
  • 扭曲的位置标头重定向

    来自render GET的方法Resource in twisted 是否可以完全重定向到不同的网址 托管在其他地方 request redirect url 似乎没有做任何事情 也没有twisted web util Redirect p
  • 使用 Twisted 和 inlineCallbacks 进行测试

    这是我的函数定义 defer inlineCallbacks def get order order id do some db operations defer returnValue order details 我想做的是使用 Twis
  • 当检测到文件更改时如何发送消息? Twisted 和 Web 套接字

    我目前正在尝试创建一个小型演示 在其中连接我的计算机和本地主机之间的网络套接字ws localhost 8080 ws 我希望网络套接 字监视我的计算机上的文件是否发生更改 如有变动 请留言 使用 Advanced Rest Client
  • 扭曲的http客户端

    我正在寻找一个描述 Twisted 的 HTTP 客户端用法的示例 看完优秀的关于 Twisted 内部结构的博客文章 http krondo com blog page id 1327 我了解 工厂 和 协议 组件如何发挥作用 但我不清楚
  • 扭曲的延迟/回调和异步执行

    我试图弄清楚如何使用twisted使我的代码更加异步 函数返回一个延迟对象 然后我添加回调列表 延迟函数通过以下方式提供一些结果后将调用第一个回调deferred obj callback 然后 在回调链中 第一个回调将处理数据并调用第二个
  • 用于构建 TCP 服务器的优秀 Python 网络库?

    我只是想知道 Python 有哪些网络库可以用来构建 TCP IP 服务器 我知道 Twisted 可能会跳到我的脑海中 但对我来说 文档似乎稀缺 草率且分散 另外 使用 Twisted 是否比使用 select select 滚动我自己的
  • 用户从 Windows XP 注销后,使用 Twisted 的 Python 应用程序停止运行

    我继承了一个使用 Twisted Python 库的项目 用户从 Windows XP 注销后 应用程序将终止 Python 代码已使用 bbfreeze 转换为可执行文件 此外 bbfreeze 生成的可执行文件使用 instsrv ex
  • 如何结合callLater和addCallback?

    实在是太崩溃了 希望大家怜悯我 reactor callLater 0 myFunction parameter1 addCallback reactor stop reactor run myFunction返回一个延迟的 我希望我想做什
  • 在 ubuntu / debian io.h 缺失上使用 pip 时出现扭曲 iocpsupport 错误

    接收错误 Building wheel for twisted iocpsupport PEP 517 started ERROR Command errored out with exit status 1 command usr bin
  • 子类化 static.File

    我是 Twisted 的新手 在对twisted 中的 static File 进行一些必要的子类化时遇到了麻烦 我正在尝试在子类中设置请求标头 class ResponseFile static File def render GET s
  • Python 中 Comet 的最新推荐? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Twisted可以用Java实现吗?

    我记得读到过以下特性导致了 Python 中有趣的框架 库的开发 我读过这篇文章http www python org workshops 2002 02 papers 09 index htm http www python org wo
  • 在 Python 中通过网络发送对象的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要通过网络发送对象 我将使用 Twisted 并且我刚刚开始查看它的文档 据我所知 python实现套接字的唯一方式是通过文本 那么我如何使
  • Python Twisted 和数据库连接

    我们的工作项目包括同步应用程序 短期 和异步 Twisted 应用程序 长期 我们正在重构我们的数据库 并将构建一个 API 模块来解耦该模块中的所有 SQL 我想创建该 API 以便同步和异步应用程序都可以使用它 对于同步应用程序 我希望
  • Scrapy - 使用 TwistedScheduler 时出现 ReactorAlreadyInstalledError

    我有以下 Python 代码来启动 APScheduler TwistedScheduler cronjob 来启动蜘蛛 使用一只蜘蛛不是问题 而且效果很好 然而 使用两个蜘蛛会导致错误 twisted internet error Rea
  • 在哪里可以找到好的 python Twisted 框架文档、博客文章、文章等? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在玩Twisted http twistedmatrix com他们主页上找到的文档并不能回答我所有的问题 目前我最感兴趣的主题是 T
  • Python Twisted 与 Cmd 模块集成

    我喜欢Python的Twisted http twistedmatrix com and Cmd http docs python org library cmd html 我想一起使用它们 我已经完成了一些工作 但到目前为止我还没有弄清楚

随机推荐

  • 如何将一个存储库重新设置为另一个存储库

    假设我有两个不同的存储库 如下所示 Project 1 Init A B C HEAD1 Project 2 Init D E F G HEAD2 有没有办法将项目 1 Init 到 HEAD 重新设置为项目 2 的 Init 提交 如下所
  • .htaccess 中的多个连字符处理(URL 重写)

    我在 URL 重写方面遇到问题 我在 htaccess 文件中编写了以下规则 RewriteRule c cat php id 1 slug 2 它给了我这样的 URL http localhost actuco c 628Y8x fran
  • 如何获取自己的地址?

    我怎样才能做到这一点 cdef class Tree cdef object key cdef Tree left cdef Tree right cdef PyObject find self key get the address of
  • 根据 stackoverflow 中的问题重新创建 pandas 数据框

    这是一个试图回答有关 pandas 数据框问题的人提出的问题 考虑一个给定数据集的问题 该数据集只是可视化 而不是实际的代码 例如 numbers letters dates all 0 1 a 20 10 2020 NaN 1 2 b 2
  • 分析 Netty 性能

    我正在编写一个 Netty 应用程序 该应用程序在 64 位八核 Linux 机器上运行 Netty 应用程序是一个简单的路由器 它接受请求 传入管道 从请求中读取一些元数据并将数据转发到远程服务 传出管道 该远程服务将向传出管道返回一个或
  • Net Core IWebHostEnvironment 仅获取“c:\”

    我正在尝试将应用程序从 net 移动到 net core 5 并且我正在尝试获取内容根目录 我看到的所有说明都显示在控制器中使用 IHostingEnvironment 然而 使用这个只是让我 c 我怀疑这是因为我试图使用它 不是在控制器中
  • SQL 查询返回包含最近日期等的重复项

    我有一个表 人 有很多列 我需要返回没有 重复 定义如下 的每个条目的完整行以及以下内容 找到该表中共享属性的条目 first name last name 和 work phone 这些是我的重复项 目的 并仅返回其 date modif
  • AttributeError:“历史”对象没有属性“预测” - 拟合训练和测试数据列表

    我正在尝试使用这个的神经网络模型example http machinelearningmastery com regression tutorial keras deep learning library python 我正在将值列表拟合
  • 同时解析 python 中的多个子命令或以其他方式对解析的参数进行分组

    我正在将 Bash shell 安装程序实用程序转换为 Python 2 7 并且需要实现复杂的 CLI 以便能够解析数十个参数 可能最多约 150 个 这些是 Puppet 类变量的名称以及十几个通用部署选项 在 shell 版本中可用
  • java本体论(jena)

    我正在做一些基于本体的项目 我想识别用户输入的文本的语义 有没有可能通过 jena 完成我处理本体的任务 Jena 不做自然语言处理 您想要查看类似的 APIZemanta http www zemanta com or 加来公开赛 htt
  • C++ 检查单例指针

    我有一个应用程序 它有一个 Qt C 单例记录器类 GetInstance 的实现是 if m Instance NULL try m Instance new Logger catch return m Instance 现在我在 h 文
  • 为什么我在 Terraform 中尝试 auto_accept vpc 对等互连时收到权限错误?

    我正在尝试在帐户之间创建 VPC 对等点并自动接受它 但失败并出现权限错误 这里有提供者 in the main tf provider aws region var region shared credentials file Users
  • MySQL 'select now()' 与 linux 'date' 不同步

    我希望有人可以快速解决这个问题 因为这是在我的生产服务器上 确实如标题所示 我以为 mysql 从安装它的机器上获取它的日期时间 好吧我错了 现在是下午 2 30 linux 说现在是下午 2 30 MySQL 说现在是上午 9 30 由于
  • 获取远程服务器环境变量

    问题 我们的 Cobol 应用程序在网络上的许多服务器 主要是服务器 2003 上运行 许多 如果不是全部 这些应用程序都使用环境变量进行设置 问题 您可以从一个工作站从远程已知服务器列表中收集环境变量的完整列表吗 最好我想在 Batch
  • 如何在自定义视图上显示数字键盘

    我创建了一个自定义视图 public class MyCustomView extends LinearLayout 当用户触摸它时 我显示键盘如下 Override public boolean onTouchEvent MotionEv
  • Visual C++ 到 Turbo C++

    您好 我已经用 Visual C 编写了一个程序 无论出于何种原因 现在我需要在 Turbo C 3 0 中运行 编译这个相同的程序 我已设法从某些来源获得编译器 但当我尝试编译代码时出现很多错误 我已经注释掉了 include stdaf
  • 使用 MediaCapture 从 CaptureElement 拍摄自定义分辨率的照片

    我正在使用 CaptureElement 在我的 Windows 应用商店应用程序中显示相机源 现在 我想在用户点击显示屏时以流的形式捕获照片 我使用下面的代码进行了工作 不幸的是 返回的图像分辨率仅为 640 x 360 但相机 Surf
  • 如何在Android中关闭系统对话框?

    我必须关闭这个系统Dialog 附在下面 我得到了这个值 但我无法在服务中而不是在活动中以编程方式关闭它 我的问题是 可以驳回吗 如果是 请帮助或指导我如何实现它 请检查一下 Override public void onWindowFoc
  • 找到与双打数组最接近的匹配

    鉴于下面的代码 如何将对象值列表与测试值进行比较 我正在构建一个地理定位应用程序 我将传递经度和纬度 并希望服务回复最接近这些值的位置 我开始沿着转换为字符串的路径 并将值格式化为小数点后两位 但这似乎有点太贫民窟 我正在寻找一种更优雅的解
  • 在 render_GET 或 render_POST 处理期间发布另一个 Web 查询

    我有一个使用 Twisted 编写的小型 Web 服务器 我想做的一件事是让它从另一个 Web 服务器返回结果作为加载页面的响应 也就是说 服务器 A 处对 render GET 的响应 通过http A com resource http