执行从Flask路由到远程服务的post请求

2024-05-19 02:10:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在创建和执行来自flask@app.route的post请求时遇到一些问题。其思想是验证和处理服务器从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

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

提前谢谢你。


Tags: 数据用户服务器webappurlflaskdata
2条回答

使用您的用户数据发送post请求。然后分析响应以获取链接。

import requests
from flask import Flask, redirect   

app = Flask(__name__)    

@app.route('/test', methods=['POST'])
def test():
    # Get your post data from your client request and process it

    # Send POST request 
    r = requests.post("http://example.com", data={your_data})

    res_var = response.text #TEXT/HTML response
    res_code = response.status_code, response.reason #HTTP
    new_destination = '' # get your new link from res_var

一旦你有了重定向链接。。。简单使用:

return redirect(new_destination, code=302)

不需要将用户重定向到远程服务器。只需在该路由函数中发送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()

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")

或者类似的事情。

希望我的解释清楚。

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

相关问题 更多 >

    热门问题