执行从烧瓶路由到远程服务的发布请求

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)

关于我应该如何使用发布请求将用户重定向到远程服务的任何提示(用户将再次被远程服务重定向到另一个页面)?

先感谢您。

Art*_*ski 5

您不需要将用户重定向到远程服务器。只需发送这条路线函数内部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)

或类似的东西。

希望我的解释清楚。

您也可以注意asyncioSanic使用异步方法。