从烧瓶路径执行post请求到远程服务

时间:2018-03-27 22:02:17

标签: 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

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

提前谢谢。

2 个答案:

答案 0 :(得分:1)

您无需将用户重定向到远程服务器。只需在此路由功能中发送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以使用异步方法。

答案 1 :(得分:0)

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

cargo.jvmargs

获得重定向链接后,只需使用:

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

相关问题