Как отдавать json генерируемый скриптом браузеру?

Рейтинг: 0Ответов: 1Опубликовано: 30.01.2023

У меня есть python скрипт который выводит нужную мне информацию прямо в консоль.

А мне хотелось бы поднять минимальные веб-сервер, который вы при переходе по ссылке типа: http://ip.my.server?parametr1=1&parametr2=2 запускал нужную мне команду и отдавал на экран json

сейчас мой скрипт запускается через консоль такой командой: myPythonScript parametr1 parametr2

прощу прощения если вопрос глупый, я только сегодня начал знакомство с Python.

Мой сервер работает на Ubuntu 22.04

Ответы

▲ 0

Простой сайт можно сделать на flask (pip install flask)

У вас уже есть скрипт на питоне, пусть будет myPythonScript.py. Сейчас он принимает аргументы и запускает по ним логику.

Теперь, чтобы его использовать на сервере у вас 2 пути:

  • Вы можете не трогать его и запускать через subprocess:

    from subprocess import Popen, PIPE
    
    process = Popen([program, 'myPythonScript.py', parametr1, parametr2], stdout=PIPE, shell=True)
    result = process.communicate()[0].decode().strip()
    print(result)
    

    Переменные parametr1 и parametr2 заранее создаете

  • Импортировать его в скрипт сервера и вызывать у него функцию, что обработает параметры:

    import myPythonScript
    result = myPythonScript.run(parametr1, parametr2)
    print(result)
    

    Переменные parametr1 и parametr2 заранее создаете. А в myPythonScript.py должна быть функция run, что принимает параметры и возвращает результат

    А чтобы ограничить код, который при импорте не должен выполняться, добавляете условие if __name__ == '__main__': (как у сервера)

Останется, добавить один из вариантов в скрипт сервера и выполнять в index

Пример:

from flask import Flask, request


app = Flask(__name__)


@app.route("/")
def index():
    args = request.args
    return {
        'status': 'ok',
        'parametr1': args.get('parametr1'),
        'parametr2': args.get('parametr2'),
    }


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

Перешел по http://127.0.0.1:5000/?parametr1=1&parametr2=2

И сайт вернул {"parametr1":"1","parametr2":"2","status":"ok"} с заголовком Content-Type: application/json


PS.

По-умолчанию, flask сортирует ключи json, чтобы отключить это нужно добавить:

app.config['JSON_SORT_KEYS'] = False