Страницы

Поиск по вопросам

Показаны сообщения с ярлыком cgi. Показать все сообщения
Показаны сообщения с ярлыком cgi. Показать все сообщения

среда, 22 января 2020 г.

Обработка GET-запросов на python: сохранить значение из одного запроса и отдать в другом

#python #get #cgi #esp8266


Добрый день! Написал (точнее скопипастил) такой сервер:

from http.server import HTTPServer, CGIHTTPRequestHandler
import time

server_address = ('192.168.0.198', 800)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
begin_time = time.asctime()
print('Server started on', begin_time)
print('Server is running on address', server_address[0], 'on port', server_address[1])
httpd.serve_forever()


Он принимает данные (GET-запрос) с платы ESP8266. Эти данные в консоли отображаются,
но вот нормально их обработать не могу (хочу выводить на отдельной странице).

Что посоветуете?

UPD. С точки зрения пользователя должно быть так: зашел на 192.168.0.198:800/...
и увидел окошко со значением температуры (её я и получаю get-запросом). На этом же
адресе запущен сервер.
    


Ответы

Ответ 1



микроконтроллер с датчиком температуры отправляет показания методом get Чтобы создать http-сервер, который записывает температуру, полученную в GET запросе от микроконтроллера, и показывает её позже в последующих запросах, можно использовать bottle библиотеку: #!/usr/bin/env python from bottle import route, request, run, template # $ pip install bottle temperature = None @route('/') def index(): global temperature temperature = request.query.temperature or temperature return template('Temperature: {{temperature}}', temperature=temperature) run(host='localhost', port=8000) При запуске этого Питон-скрипта, запускается http-cервер, который слушает на локальной машине на 8000 порту. При получении GET-запроса, содержащего temperature параметр, глобальная переменная temperature обновляется и тут же показывается как html. Если temperature параметр не указан, то возвращается предыдущее значение или None, если ещё ни разу не был temperature параметр задан. То есть ожидается, что часть читающая температуру с датчика выполняет запросы типа: $ http ':8000?temperature=20' что устанавливает значение (20). Чтобы прочитать это значение, достаточно не указывать параметр: $ http :8000 Можно в браузере посмотреть (тот же запрос): $ python -mwebbrowser http://localhost:8000 http команду можно получить, установив httpie библиотеку: $ pip install httpie Обычно вместо использования глобальных переменных используется база данных (что позволяет сохранять значение температуры между запусками серверного процесса или его экземплярами в разных процессах). В простейшем случае, простой плоский текстовый файл может использован. Вот пример c sqlite. Если не хочется ставить bottle с помощью команды (предпочтительно внутри virtualenv): $ pip install bottle то достаточно скачать bottle.py и положить его рядом с кодом сервера.

воскресенье, 29 декабря 2019 г.

Объясните, что такое CGI?

#терминология #cgi


Что такое CGI? С вики статью прочитал ничего не понял. И что значит PHP установлен
как CGI?
    


Ответы

Ответ 1



И что значит PHP установлен как CGI? Это значит что хостинг не может сделать нормальную настройку php и привязать её к апачу. в каждом скрипте придется указывать #!/usr/local/bin/php чтобы все это безобразие заработало. Лучше привязка php к апачу как модуль. тут почитать немного И что тут непонятно написано? Последний вопрос, зачем тебе это нужно если ты не понимаешь этого? Просто ради "Чтобы знать!" или есть какие-то еще варианты?

Ответ 2



Вообще-то CGI означает технологию, которая позволяет веб-серверу взаимодействовать с обычными исполняемыми программами и скриптами, которые пишутся практически на любом языке программирования. Т.е. к примеру, если какой-нибудь Вася не знает ни PHP ни ASP, но отлично знает C++ или Pascal и хоть немного разбирается в HTML, он может сделать программу, которая будет генерировать свой динамический сайт в консоль. Веб-сервер, при запросе этого сайта, выполняет эту программу, а результат ее работы (вывод консоли) возвращает клиенту, который его запросил. Именно об этом и говорит предупреждение PHP установлен как CGI т.е. при запросе любой PHP-странички, веб-сервер будет выполнять программу php, вместо того, чтобы передать управление модулю PHP. т.е. на каждую страничку веб-сервер будет создавать новый процесс. Не все системы оптимизированы под такое взаимодействие программ, поэтому принято считать такой способ дорогим.

вторник, 10 декабря 2019 г.

Игнорируется лимит на размер загружаемых файлов

#php #nginx #cgi


Настраиваю php-сервер для обработки прайсов. Работает Apache в связке с Nginx. Режим
работы php - CGI. В файле php.ini, среди прочего, указаны такие настройки:

file_uploads = On
upload_max_filesize = 100M
post_max_size = 300M


В файле nginx.conf указано

http {
    ...
    client_max_body_size 128m;
}


Однако максимальный размер загружаемых файлов всё равно не может превышать 2Мб. При
загрузке файлов, размер которых превышает 2Мб, в глобальной переменной $_FILES содержится
ошибка: $_FILES['Price']['error'] == 1

Вроде всё сделал правильно, но всё равно не работает, почему-то, как мне надо. В
какую сторону мне вообще смотреть? Какие мануалы курить?

UPD: Сервер управляется ПУ ISPmanager. PHP v7 подключен в виде альтернативной версии
для CGI, так как из коробки у ISPmanager нет PHP v7, только v5.33. Поэтому пришлось
использовать CGI, так как альтернативные версии только в этом режиме подключаются,
а играться с обновлением стандартного пыха и его привязкой к панели не было времени
- сервер чисто промежуточный для формирования прайсов.
    


Ответы

Ответ 1



Давая дополнительную информацию по своему вопросу, случайно догадался о решении проблемы. Так как я использую альтернативную версию PHP в режиме CGI, то конфиги для этой версии должны быть отдельными, по идее. И это оказалось именно так. Я их нашёл - они лежат непосредственно в /var/www/php-bin-isp-php70/. Там же лежит и php.ini конкретно для этой версии. А я менял /etc/php.ini, который отвечает за стандартную версию PHP в режиме апача. В общем, я отредактировал конфиг /var/www/php-bin-isp-php70/php.ini и теперь всё работает. Спасибо всем, кто участвовал в решении моей проблемы. :)

среда, 13 марта 2019 г.

Обработка GET-запросов на python: сохранить значение из одного запроса и отдать в другом

Добрый день! Написал (точнее скопипастил) такой сервер:
from http.server import HTTPServer, CGIHTTPRequestHandler import time
server_address = ('192.168.0.198', 800) httpd = HTTPServer(server_address, CGIHTTPRequestHandler) begin_time = time.asctime() print('Server started on', begin_time) print('Server is running on address', server_address[0], 'on port', server_address[1]) httpd.serve_forever()
Он принимает данные (GET-запрос) с платы ESP8266. Эти данные в консоли отображаются, но вот нормально их обработать не могу (хочу выводить на отдельной странице).
Что посоветуете?
UPD. С точки зрения пользователя должно быть так: зашел на 192.168.0.198:800/... и увидел окошко со значением температуры (её я и получаю get-запросом). На этом же адресе запущен сервер.


Ответ

микроконтроллер с датчиком температуры отправляет показания методом get
Чтобы создать http-сервер, который записывает температуру, полученную в GET запросе от микроконтроллера, и показывает её позже в последующих запросах, можно использовать bottle библиотеку
#!/usr/bin/env python from bottle import route, request, run, template # $ pip install bottle
temperature = None
@route('/') def index(): global temperature temperature = request.query.temperature or temperature return template('Temperature: {{temperature}}', temperature=temperature)
run(host='localhost', port=8000)
При запуске этого Питон-скрипта, запускается http-cервер, который слушает на локальной машине на 8000 порту.
При получении GET-запроса, содержащего temperature параметр, глобальная переменная temperature обновляется и тут же показывается как html. Если temperature параметр не указан, то возвращается предыдущее значение или None, если ещё ни разу не был temperature параметр задан.
То есть ожидается, что часть читающая температуру с датчика выполняет запросы типа:
$ http ':8000?temperature=20'
что устанавливает значение (20).
Чтобы прочитать это значение, достаточно не указывать параметр:
$ http :8000
Можно в браузере посмотреть (тот же запрос):
$ python -mwebbrowser http://localhost:8000
http команду можно получить, установив httpie библиотеку
$ pip install httpie

Обычно вместо использования глобальных переменных используется база данных (что позволяет сохранять значение температуры между запусками серверного процесса или его экземплярами в разных процессах). В простейшем случае, простой плоский текстовый файл может использован. Вот пример c sqlite
Если не хочется ставить bottle с помощью команды (предпочтительно внутри virtualenv):
$ pip install bottle
то достаточно скачать bottle.py и положить его рядом с кодом сервера.

среда, 12 декабря 2018 г.

Что такое CGI?

Извините возможно за столь тупой вопрос но подскажите пожалуйста что такое CGI? С вики статью прочитал ничего не понял. И что значит PHP установлен как CGI?


Ответ

И что значит PHP установлен как CGI? Это значит что хостинг не может сделать нормальную настройку php и привязать её к апачу. в каждом скрипте придется указывать #!/usr/local/bin/php чтобы все это безобразие заработало. Лучше привязка php к апачу как модуль. тут почитать немного И что тут непонятно написано? Последний вопрос, зачем тебе это нужно если ты не понимаешь этого? Просто ради "Чтобы знать!" или есть какие-то еще варианты?