0

Wrote a flask app which do some job (can last up to 3 hours) and then sends response to slack via slack incoming webhook. application is being called via slack slash command, to which I must response within 3000ms, otherwise it throws an timeout error. Used webhooks to send response after job done as I cannot send response to response_url after 30 minutes. (Slack Slash commands)

from flask import Flask, request, Response, jsonify
import webbrowser
import os
import time
import json
import requests
...
some functions here
...
app = Flask(__name__)

@app.route('/tests', methods=['POST'])
def test(): 
    if "text" in request.form:
        if not request.form["text"]:
            return slackCommandResponse("No parameters provided. Please run /run-tests <url> <test_ID>")
        else:
            params = request.form["text"]
            user_id = request.form["user_id"]
            payload = {'token': ''+token+'', 'user': user_id }
            user_req = requests.get('https://slack.com/api/users.info', params=payload)
            user_data = user_req.json()
            real_name = user_data['user']['real_name']
            user_email = user_data['user']['profile']['email']
            if len(params.split()) > 2:
                return slackCommandResponse("More parameters are provided than needed. Please run /run-tests <url> <test_ID>")
            else:
                baseUrl = params.split(" ")[0]
                if not len(params.split()) > 1:
# here is the response need to be send
                    return slackCommandResponse("No test ID provided. Running all tests. You will be notified upon progress.")
# code part starting from here need to be executed after response above
                    for file in files(path):
                        file_full_path = os.path.join(path, file)
                        ID = file[:-4]
                        url=baseUrl+"&respondentid="+ID
                        apiUrl=apibase+"&respondentid="+ID
                        test_answer = 5
                        webbrowser.get(chrome_path).open(url)
                        openFile(file_full_path)
                        time.sleep(5)
                        checkAppIsRunning("AmcEngine.exe")
                        responseContent = requests.get(apiUrl)
                        respjson = responseContent.json()
                        test_result = (respjson["questions"][0]["qResponseData"]["basketContent"][0]["quantity"])
                        if test_result == test_answer:
                            slackResponse("Test "+ID+" passed")
                        else:
                            slackResponse("Test "+ID+" failed")
                else:

                    return slackCommandResponse("Cannot run single test yet")


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

The main issue is when I am sending the 200 response within 3000ms the rest part of my code doesn't work. Tried to use this, but it doesn't work. Not sure that the problem is in this as I was trying to do such thing first time. Any help appreciated.

Ahnenerbe
  • 303
  • 1
  • 3
  • 16

1 Answers1

0

Used this comment for my task and it worked. maybe this will save time for someone. Cheers!

Ahnenerbe
  • 303
  • 1
  • 3
  • 16