简体   繁体   中英

How to return a response in callback function with flask

here is a dll, that can compare face distance, and the compareFace.dll, I need use callback to receive it's value

now, I want use flask to wrapper it, then can visit by http and json

lib= c.CDLL('comparedFace.dll')
CALLBACKFUNC = c.CFUNCTYPE(None, c.c_int, c.c_char_p)
lib.startComparedFace.restype = c.c_int 
lib.startComparedFace.argtypes = (c.c_char_p, c.c_char_p, CALLBACKFUNC)


@app.route('/compare', methods=['GET', 'POST'])
def test():
    if request.method == 'POST':

        request_json = request.get_json()
        print(request_json)
        number       = request_json.get('number')
        image01      = request_json.get('image01')
        image02      = request_json.get('image02')
        print(image01)
        print(image02)


        @c.CFUNCTYPE(None, c.c_int, c.c_char_p)
        @copy_current_request_context
        def callback(status, result_string):

            result_json = json.loads(result_string)
            distance = result_json['compareResult']

            resp_data = {
                "number": number, 
                "distance": distance,
            }
            print(resp_data)
            response = Response(
                response=json.dumps(resp_data),
                status=200,
                mimetype='application/json'
            )
            return response


    lib.startComparedFace(b'd:/1.jpg', b'd:/2.jpg', callback)

run the code, and I receive a error ValueError: View function did not return a response

I know, I should write a return 'xxx' as response

But, I want wait the callback function, and return response in the callback function, so how should I modify my code, thank you.

Let's see a simple scenario:

  1. User gives his/her username.
  2. Our function calculates a value based on the username. Making this dummy call as time consuming call using time.sleep function.
  3. User receives the value after the operation is being completed.

This can be achieved by using the following code.

app.py :

import time
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/', methods=["GET", "POST"])
def index():
    username = None
    value = 0
    if request.method == 'POST':
        username = request.form.get("username", None)

    def calculate_value_based_on_username(user_given_name):
        time.sleep(10)
        return len(user_given_name)

    if username:
        value = calculate_value_based_on_username(username)
        return render_template('app.html', username=username, value=value)
    return render_template('app.html')

if __name__ == '__main__':
    app.run(debug=True)

app.html :

<html>
  <head></head>
  <body>
    {% if username %}
      Hello {{ username }}! Length of your username: {{ value }}
    {% else %}
      Hello guest! 
    {% endif %}
    <form action="/" method="post">
      Username: <input type="text" name="username">
      <input type="submit" name="submit" value="Submit">
    </form>
  </body>
</html>

Output:

输出

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM