use*_*239 0 python flask python-requests
我在从我的一个烧瓶@app.route 创建和执行发布请求时遇到了一些问题。这个想法是验证和处理服务器从 Web 表单接收的数据,然后使用此数据作为 post 参数调用远程服务,最后重定向到此远程服务指示的新页面。这是一个简化的骨架:
import requests
@app.route('/test', methods=['POST'])
url = 'http://exemple.com'
headers = {'Content-type': 'text/html; charset=UTF-8'}
response = requests.post(url, data=data, headers=headers)
return x
Run Code Online (Sandbox Code Playgroud)
关于我应该如何使用发布请求将用户重定向到远程服务的任何提示(用户将再次被远程服务重定向到另一个页面)?
先感谢您。
您不需要将用户重定向到远程服务器。只需发送这条路线函数内部POST请求,要么等待来自该服务器的响应,然后渲染一些模板,用户与接收到的响应或发送POST请求到所需的服务器在另一个线程,如果你知道,响应会花费大量的时间(在这种情况下,您可以立即呈现一些页面,其中类似于“正在处理您的请求”消息)。在第二种情况下(在不同线程中发送 POST 请求的情况下),您可以在重新加载页面后显示请求的结果,从主线程中的某个共享对象检索它,可以从您用来发送 POST 请求的线程修改。
1)在路由功能中发送请求:
@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()
Run Code Online (Sandbox Code Playgroud)
2) 在不同的线程中发送 POST 请求(如果您知道响应时间远高于 TCP 保持活动时间,则可以使用此选项):
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")
Run Code Online (Sandbox Code Playgroud)
或类似的东西。
希望我的解释清楚。
| 归档时间: |
|
| 查看次数: |
10470 次 |
| 最近记录: |