Как вернуть ответ в функцию обратного вызова с колбой - PullRequest
0 голосов
/ 25 апреля 2018

здесь dll, которая может сравнивать расстояние до лица, и compareFace.dll, мне нужно использовать callback, чтобы получить его значение

, сейчас я хочу использовать колбу, чтобы обернуть ее, затем можно зайти по http и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)

запустить код, и я получаю сообщение об ошибке ValueError: View function did not return a response

Я знаю, я должен написать возвращение 'ххх' в качестве ответа

Но яЯ хочу подождать функцию обратного вызова и вернуть ответ в функцию обратного вызова, поэтому как мне изменить мой код, спасибо.

1 Ответ

0 голосов
/ 25 апреля 2018

Давайте посмотрим на простой сценарий:

  1. Пользователь дает свое имя пользователя.
  2. Наша функция вычисляет значение на основе имени пользователя. Выполнение этого фиктивного вызова как трудоемкого вызова с использованием функции time.sleep.
  3. Пользователь получает значение после завершения операции.

Этого можно достичь с помощью следующего кода.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...