<p>不需要将用户重定向到远程服务器。只需在该路由函数中发送POST请求,然后<strong>等待该服务器的响应,然后将一些模板呈现给具有接收到的响应的用户<strong>或</strong>如果知道响应可能需要很长时间,则在另一个线程中将POST请求发送到所需的服务器(在这种情况下,您可以呈现一些页面立即出现“正在处理您的请求”消息。在第二种情况下(在另一个线程中发送POST请求的情况下),您可以在从主线程中的某个共享对象检索页面后显示请求的结果,该共享对象可以从用于发送POST请求的线程进行修改。</p>
<p>1)在进路功能中发送请求:</p>
<pre><code>@app.route('/test/', methods=['POST'])
def test():
url = 'http://exemple.com'
headers = {'Content-type': 'text/html; charset=UTF-8'}
response = requests.post(url, data=data, headers=headers)
# wait for the response. it should not be higher
# than keep alive time for TCP connection
# render template or redirect to some url:
# return redirect("some_url")
return render_template("some_page.html", message=str(response.text)) # or response.json()
</code></pre>
<p>2)在不同的线程中发送POST请求(如果知道响应时间远高于TCP保持活动时间,则可以使用此选项):</p>
<pre><code>from threading import Thread
from flask import Flask, redirect
app = Flask(__name__)
shared_var = None
req_counter = 0
def send_post_req(url, data):
global shared_var
headers = {'Content-type': 'text/html; charset=UTF-8'}
response = requests.post(url, data=data, headers=headers)
shared_var = response.text # or response.json() - it's up to you
@app.route('/test/', methods=['POST'])
def test():
global req_counter
url = 'http://exemple.com'
data = "some data"
if req_counter == 0:
t = Thread(target=send_post_req, args=(url, data))
t.setDaemon(True)
t.start()
req_counter = 1 # use req_counter if you want to send request only one time
if shared_var:
# render some page or redirect to desired url using:
# return redirect(url_for('some_route_name'))
# or
# return redirect("some_url")
return render_template("some_page.html", message=str(shared_var))
return render_template("some_page.html", message="Your request is being processed")
</code></pre>
<p>或者类似的事情。</p>
<p>希望我的解释清楚。</p>
<p>您还可以注意<a href="https://docs.python.org/3/library/asyncio.html" rel="nofollow noreferrer">asyncio</a>和<a href="https://sanic.readthedocs.io/en/latest/" rel="nofollow noreferrer">Sanic</a>来使用异步方法。</p>