【问题标题】:Using django for non http requests使用 django 处理非 http 请求
【发布时间】:2015-09-28 12:20:02
【问题描述】:

我可以使用 django 来处理 http-requests 和响应吗?我有一个提供网页的 django web 应用程序,我想用它来通过 tcp 与其他设备(手持 gps 发送状态报告和接收 ack)进行通信,但 django 报告请求是“

code 400, message Bad HTTP/0.9 request type".

    [28/Sep/2015 15:14:26] code 400, message Bad HTTP/0.9 request type ('[V1.0.0,244565434376396,1,abcd,2015-09-28')
    [28/Sep/2015 15:14:26] "[V1.0.0,244565434376396,1,abcd,2015-09-28 14:14:12,1-2,865456543459367,2,T1]" 400 -

来自设备的消息通过 tcp 以文本形式发送,根本没有 http 参数。

我还没有找到任何有关如何使用 django 执行此操作的信息,但如果可能的话,它会让我的生活更轻松。

谢谢!

【问题讨论】:

  • 这里的问题很可能是为网站提供服务的网络服务器(apache?),因为它被编程为接受 HTTP(s) 连接。我很确定当你想接受非 HTTP 连接时它会给你带来问题。您可能需要打开自己的套接字来接受这样的连接。不确定这将如何与 django 一起使用,因为它通常需要 http 请求。
  • 谢谢!看来我必须在 django 之外实现一些东西。

标签: python django tcp


【解决方案1】:

我不知道。

Django 是一个网络框架,因此它是围绕某个范式设计的,如果不是某个协议的话。

设计大量通知 - 如果不是通过 HTTP - 通过 URL、请求、无状态协议等概念。

如果模板系统和路由系统被去掉,你将留下一个美化的 ORM 和一些无用的代码。

但是,除非您使用自己的协议处理现有设备,否则您可以使用 Django构建RESTful 服务,以便与其他设备成功交换信息网络浏览器前的两足动物。

This article on Dr. Dobb's 信息量很大。

Django REST虽然不是必须的,但可以帮助你。

如果您真的受困于旧设备和协议,您可以编写适配器/代理来接收您设备的请求并将其转换为 RESTful 调用,如果你的协议足够在语义上而不是在语法上看起来像 HTTP(例如,如果你只需要将 QUUX aaa:bbb:ccc: 转换为 GET xx/yy/zz)。

如果它没有一点点 HTTP 的语义,我会说 Django 帮不了你太多。

【讨论】:

  • 感谢您的提示,但遗憾的是 REST 无法工作,因为我无法触摸设备。我有点想我不走运,因为我没有找到有关非 http 请求的信息。
  • @Svante:正如我上面提到的,您可以考虑为 RESTful 服务编写适配器。你可能想权衡利弊。以这个 cum grano salis 为例,但你会考虑使用 Django 的事实让我怀疑你的协议是......足够 webb-ish。
  • 绝对!我认为这可能是最好的方法。我目前正在寻找一个使用 SocketServer 的解决方案,我发现 Django TCP socket communication 用于将请求转发到主应用程序。
  • @Svante:请注意,您链接的答案提出了一个 regular Python 脚本,然后说“您仍然可以导入 django 的库并在SocketServer”——正如我之前所说,你最终会在一个 hackish 脚本中使用 Django 作为美化的 ORM。根据您的要求,这可能是一个次优/可扩展性较差的架构解决方案。当然,它可能会让你的船漂浮得很好。 :)
  • 更新:我最终在 django 项目之外编写了一个单独的 SocketServer 脚本(它由主管运行)。该脚本在单独的端口上侦听传入流量,检查传入请求,打开 django 项目的 url 套接字,django 处理请求并通过 url 套接字返回带有结果的 JsonResponse。
【解决方案2】:

我赞同您可以使用其他方法更好地处理非 http 的建议,但我确实有一个关于如何构造一个 可以 的 Django 应用程序的建议。 HTTP 处理发生在中间件中,您可以让您的应用程序位于该堆栈的顶部,并通过返回响应而不是将其向下传递到堆栈或准备模拟请求以向下传递给其他处理程序来抢占其他中间件,在返回途中获取响应,以便为您的接收者进行后期处理。

这感觉很老套,可能需要一堆非正统的技巧,但这就是我所说的解决问题的方式。

【讨论】:

  • 谢谢!嗯,这可能行得通,我目前正在寻找使用 SocketServer 的解决方案,但我也可能会更仔细地检查您的建议 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多