【问题标题】:How to programmatically communicate with Apache?如何以编程方式与 Apache 通信?
【发布时间】:2018-02-04 23:53:56
【问题描述】:

如今有如此多的 Web 应用程序在它们自己的微服务器上运行,因此很难在共享托管平台上实现它们。应用程序侦听您可以自定义或反向代理的专用端口,但共享主机通常只打开 80 和 443。

例如,方便的基于 Web 的编辑器 ICEcoder 是一个 PHP 应用程序,因此您只需将文件放到一个目录中即可。但是,Cloud9 编辑器运行它自己的服务器。您可以自定义端口,但同样不能运行反向代理。

我有使用 PHP 或 Python CGI 脚本作为中介的想法。比如:

www.mydomain/mydirectory/middleman.py

from BaseHTTPServer import BaseHTTPRequestHandler
import urlparse, json
# hpyothetical apache api
import apache

parsed_path = urlparse.urlparse(self.path)

response = apache(url=parsed_path, port=8080)

sendStuffBack(response)

这对于 Apache 是否可行?我将如何实现它?

编辑: 这是我根据@grawity 的回答所做的。

helloflask.py

#!/usr/bin/env python

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

middle.py

#!/usr/bin/env python

print ("Content-Type: text/html")
print()

import requests
#response = requests.get("http://localhost:5000")
response = requests.get("http://localhost:8888/token=8a387fe88d662e2568f9b8ec2398191452492e7184536670")

print(response.text)

【问题讨论】:

  • 您可以编辑您的问题以包含一个问题吗?
  • @Spiff 这更好吗? :)

标签: python web-applications port reverse-proxy shared-hosting


【解决方案1】:

您的 Python 项目一个反向代理,而您正在寻找的 API 只是普通的 HTTP。 (毕竟,这就是网络浏览器与 Apache 交互的方式......)

要发出 HTTP 请求,您需要像 urllibrequests 这样的客户端:

import requests

response = requests.get("http://" + apache_host + ":8080/" + parsed_path)

默认情况下,您的所有应用程序和微服务器都会认为所有客户端都来自本地主机。如果这是一个问题,请查看您的应用是否接受 X-Forwarded-For 标头。 (如果有,请将其包含在您的所有请求中。)

【讨论】:

  • 应该的。您的 Python 脚本正在访问端口 8080,而不是用户自己。 (无论如何,您将如何访问“API”?)
  • 好的!这在一定程度上确实奏效了。我只使用了print(response.text)。我在端口 5000 上启动了一个 hello world 烧瓶应用程序,我得到了“hello world”。但是,当我向在端口 8888 上运行的 jupyter notebook 发出获取请求时,我的页面格式错误。我将源与我从直接调用中获得的源进行了比较,源是相同的。所以我可能需要开始一个新问题来找出什么不起作用。
  • 快速说明——像图片的相对链接(例如<img src = "some-image.jpg">)需要用完整路径重写,以免被破坏,例如<img src = "http://some-site.com/path/to/some-image.jpg">).
  • @Anaksunaman:你确定不是相反的吗?相对链接的整个想法是,无论路径如何,它们都可以工作......但绝对链接肯定需要重写。
  • @grawity 好吧,我想我不应该说绝对。 =) 如果你有一个<base> 标签,你可以重写它,很明显。如果没有(假设我没有错过其他非常容易的东西),我想你可以插入一个。避免重写的另一个选项是在您的 Web 目录中重新创建完全相同的文件夹结构(相同的文件夹名称/相同的图像位置),从根目录开始,但这看起来很混乱。
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2011-12-11
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多