Форум сайта python.su
Добрый день,
Не знаю в какую сторону копать гранит науки, подскажите. Мне нужно, чтоб html страница на одном компьютере обрабатывала локальные мои запросы к ней с другого компьютера и изменяла своё содержимое соответственно. Как я понял мне нужен веб сервер на Python, который будет обрабатывать get запросы (get вполне меня устраивает). На просторах интернета я нашёл много разной литературы и у меня получился вот такой код, который прекрасно отлавливает get запросы, но я не знаю как мне сделать отображение html тегов и вписывать в них результат обработки get запроса.
from http.server import HTTPServer, CGIHTTPRequestHandler import socket, re, cgi from io import BytesIO import simplejson as json if len(socket.gethostbyname_ex(socket.gethostname())[2]) >= 1: print("Сервер запущен на адресе: %s"%socket.gethostbyname_ex(socket.gethostname())[2][0]) class HttpProcessor(CGIHTTPRequestHandler): def _send_cors_headers(self): """ Sets headers required for CORS """ self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Methods", "GET,POST,OPTIONS") self.send_header("Access-Control-Allow-Headers", "x-api-key,Content-Type") def send_dict_response(self, response): self.wfile.write(bytes(json.dumps(response), "utf8")) def do_OPTIONS(self): self.send_response(200) self._send_cors_headers() self.end_headers() def do_GET(self): self.send_response(200) self._send_cors_headers() self.end_headers() get_data = re.findall('\w+', self.path) response = {} print("response 1 = ", response) for i in range(0, len(get_data)-1, 2): response[get_data[i]] = get_data[i+1] self.send_dict_response(response) server_address = ("192.168.0.105", 5000) httpd = HTTPServer(server_address, HttpProcessor) httpd.serve_forever()
http://192.168.0.105:5000/?username=admin&password=12345
my_page_content = b"<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"></head>\ <body>\ <div id=\"logo\">\ <a href=\"#\" title='To main page'>My Site</a>\ </div>\ <div id=\"menuHeader\">\ <a href=\"#\"> About</a> | <a href=\"#\">FeedBack</a>\ </div>\ <div id=\"regAuth\">\ <a href=\"#\">Register</a> | <a href=\"#\">Autorization</a>\ </div>\ <div id=\"Name\">Name:<div id=\"received_name\">NON</div></div>\ <div id=\"Password\">Password:<div id=\"received_password\">NON</div></div>\ </body>\ </html>"
Офлайн
> Не знаю в какую сторону копать гранит науки
Копай в сторону веб-фреймворков.
Офлайн
Спасибо, копаю в сторону DJANGO, но пока что вижу только как создавать сайты, а как сервер построить не вижу. Как мне правильно сформулировать запрос для поисковиков? А то боюсь, что даже найдя что-то нужное, я могу это нужное не распознать и закрыть
Офлайн
Используй Flask.
https://flask.palletsprojects.com/en/1.1.x/
Там есть шаблоны, в которые можно подавать переменные
https://flask.palletsprojects.com/en/1.1.x/quickstart/#rendering-templates
Шаблоны в Flask - это Jinja. Они развитые (в них можно делать функции и конвейеры)
https://jinja.palletsprojects.com/en/2.10.x/
Дальше тебе на компе надо поставить простой сервер типа gunicorn или там ещё какой-нибудь (там есть несколько вариантов)
https://flask.palletsprojects.com/en/1.1.x/deploying/#deployment
Дальше ты приложение на Flask связываешь с базой данных. Если хостинг - это твой комп, можешь вообще базу в файле хранить в формате JSON или SQLite. Если хостинг чужой, типа Heroku, то там такое не прокатит, там есть PostgreSQL с ограничениями. Ну, на немножко чего-то хватает, пока бесплатно там сидишь. У меня роботы в Slack'е используют эту бесплатную базу для антифлуда при запросах к ним. Ну, оно так работает через пень колоду, потому что эта база там сначала “просыпается”, а потом только идёт реакция. Пока комп твой, можешь не волноваться, всё будет работать так, как настроишь. Но как только тебе надо будет вынести это со своего компа в Интернет и чтобы оно там само работало, могут возникнуть препятствия. А выносится это потому, что свой комп не всегда включен, а хостинг какой-нибудь в Интернете всегда включен - в этом вся разница.
Дальше при GET-запросе (хотя не важно при каком запросе даже) Flask через твой скрипт делает запись в базу данных (допустим, в файл JSON), а при загрузке страницы сначала из этого файла берутся данные. Если там данных нет, то и на странице ничего нет. А если там данные есть, то и на странице они появляются. Таким образом ты разными запросами можешь по-разному работать с этим файлом, по которому строится страница. Можешь туда что-то дописать, можешь оттуда что-то удалить, можешь там что-то заменить на другое, - то есть там CRUD полный. Можешь делать GET-запросы и предоставлять им параметры. Для пароля можешь делать POST-запросы и передавать в них пароль в зашифрованном виде. Также во Flask есть сессия, но для начала можно без неё всё построить - может хватить.
Отредактировано py.user.next (Март 28, 2020 03:05:07)
Офлайн
Dessan
Мне нужно, чтоб html страница на одном компьютере обрабатывала локальные мои запросы к ней с другого компьютера и изменяла своё содержимое соответственно.
DessanВ рамках данного обсуждения создать веб сервер и создать создать веб сайт это синонимы.
но пока что вижу только как создавать сайты, а как сервер построить не вижу
Офлайн
doza_andОн же привёл пример на модуле http, где он не знает только, как изменить ответную html-страницу (не знает про str.format() ). Потом он пытается изобрести шаблонизатор.
Напрашивается вывод что вам не нужны flask dgango и все прочие веб технологии (у вас передача сообщений в другую сторону и вам не нужно обслуживать множество клиентов). Вам надо построить свою GUI программу, которая будет сервером
doza_andА с GUI он получит не только ограничение на использование этой программы потом (не сможет её поставить в сети и использовать удалённо), так ещё и протокол обмена ему придётся изобретать, вместо того, чтобы взять уже готовый протокол HTTP. Если он откроет сокет, протокол там сам по себе не появится, его надо будет имплементировать.
Вам надо построить свою GUI программу, которая будет сервером и будет отображать состояние пользуясь html разметкой
Отредактировано py.user.next (Март 28, 2020 09:51:37)
Офлайн
To doza_and - я попытался изложить максимально понятно конечный результат и его функционал. Я сюда с тем и пришёл, чтоб мне посоветовали как реализовать мою идею. В любом случае спасибо за уделённое внимание и ответ. Я не слышал даже о wxPython и Qt, обязательно ознакомлюсь.
To py.user.next - о str.format() знаю, но не представляю как его применить для моих целей.
По поводу функционала более детально: у нас локальная сеть с компьютерами и телефонами, никакой интернет мне не нужен на данном этапе. Есть устройство, которое может считывать свои параметры и отправлять результат по сетке, для примера, пусть это будет IP камера, которая может отправлять get запросы и принимать get запросы. Ее задача отправлять отправлять get запрос с положением своей позиции и сигнал тревоги при обнаружении движения и принимать get запросы для изменения своей позиции. То есть наше устройство принимает и отправляет get запросы в разных форматах, мне удобней в формате json - он простой, наглядный и из него легко брать данные и более нам это устройство не интересно.
Есть стационарный компьютер, на котором я планировал сделать очень красочный интерфейс, где в зависимости от полученных по локальной сети get запросы/ответы от нашего устройства будет изменяться этот интерфейс, там будут разные кнопки, вкладки, картинки и т.д. и все это должно быть кликабельно и в результате этих кликов мы будем отправлять нашему устройству очередные get ответы и запросы. Я ничего лучше не смог придумать, кроме как реализовать всю эту красоту с помощью html разметки, тем более, что есть и специальная программа, которая и html разметку показывает и работает с get запросами/ответами и называется она браузером. И для постоянной работы браузера я могу выделить компьютер. Написать html код и создать страницу с css, javascript я в состоянии. Представим, что у меня уже есть красивая страница с кучей кода, различными вкладками, кнопками, окнами и я хочу заходить на эту страницу с любого устройства по локальной сети: планшет, мобильный, телевизор, ноутбук и т.д. и видеть все изменения на ней, а также иметь возможность пользоваться вкладками, окнами, кнопками и т.д.
Наверно, более детально описать у меня не получится. Как бы вы реализовали мою задумку?
Офлайн
DessanБез опыта ты на них ничего приемлемого не напишешь, даже на чистом формошлёпстве в Qt Designer'е. Тебе придётся понимать, как они работают, а для этого надо книжку прочитать (особенно про Qt, в котором сигналы и слоты не такие уж и интуитивные; методом тыка ты их не поймёшь). К тому же понадобится асинхронная архитектура приложения, в которой ты, конечно же, тоже не шаришь. Это придётся сначала несколько программ асинхронных написать, чтобы понять, как их вообще писать, и применить потом это понимание в рабочей программе, которая нужна, а не просто для учебной тренировки делается.
Я не слышал даже о wxPython и Qt, обязательно ознакомлюсь.
DessanДа, поначалу много чего не надо. А потом раз и поменялись условия и сеть разносится сначала между разными зданиями, а потом и между разными городками, а потом её вообще подключать нужно к какому-нибудь федеральному центру. Всё это играет роль, когда ты стоишь перед выбором: либо использовать уже написанную одну программу, либо писать три новых программы и ещё неизвестно, когда они будут готовы и кто их вообще писать будет, за сколько миллионов и напишет ли вообще в итоге. Так что такие вещи сразу нужно продумывать, когда даже ничего нет ещё.
у нас локальная сеть с компьютерами и телефонами, никакой интернет мне не нужен на данном этапе
DessanЯ и говорю, что ты пытаешься шаблонизатор написать, который уже написан, - Jinja. Он хорошо развит и он бесплатный. Его можно переизобрести и использовать всё то же самое, только через str.format() делать. Получится, конечно, не шаблонизатор, а что-то похожее на шаблонизатор. Но оно получится хуже в сто раз и поплывёт при первом же изменении требований.
о str.format() знаю, но не представляю как его применить для моих целей.
DessanТы не будешь отправлять это “окну” или “из окна”. Ты будешь отправлять это службе (абстрактно говоря, потому что “службу” ты можешь и как программу запустить, хотя при стандартных условиях для этого делается служба в операционной системе). И служба у тебя обрабатывает все запросы и посылает ответы. А окно, гуишное оно или браузерное, оно просто у этой службы спрашивает “какая там сейчас ситуация у тебя в базе данных, покажи мне, а я отображу на экране это в красивом виде”.
пусть это будет IP камера, которая может отправлять get запросы и принимать get запросы. Ее задача отправлять отправлять get запрос с положением своей позиции и сигнал тревоги при обнаружении движения и принимать get запросы для изменения своей позиции
DessanНа Flask'е ты это всё построишь быстрее всего. И его реально изучить быстро. Сайтом тут и не пахнет, поэтому Django - платформа для создания CMS'ок, которые управляют сайтами, - тут вообще не нужна, потеряешь только время на её изучение и не будешь использовать потом 50% изученного.
Наверно, более детально описать у меня не получится. Как бы вы реализовали мою задумку?
Отредактировано py.user.next (Март 28, 2020 22:33:31)
Офлайн
Начитался я этого FLASK, вывел Hello World, создал папки static и templates. Вроде более менее понятно, но какой мне выбрать сервер и есть ли какой-то проверенный источник с более менее детальным объяснением? И я никогда не имел дело с апачи и не очень люблю базы данных, потому что я их практически не знаю. Хостингом является мой же локальный ноутбук.
То что на сайте написано для Gunicorn мне вообще никак не помогло:
Gunicorn ‘Green Unicorn’ is a WSGI HTTP Server for UNIX. It’s a pre-fork worker model ported from Ruby’s Unicorn project. It supports both eventlet and greenlet. Running a Flask application on this server is quite simple: $ gunicorn myproject:app Gunicorn provides many command-line options – see gunicorn -h. For example, to run a Flask application with 4 worker processes (-w 4) binding to localhost port 4000 (-b 127.0.0.1:4000): $ gunicorn -w 4 -b 127.0.0.1:4000 myproject:app The gunicorn command expects the names of your application module or package and the application instance within the module. If you use the application factory pattern, you can pass a call to that: $ gunicorn "myproject:create_app()"
Офлайн
DessanДля Windows используют Waitress вместо Gunicorn.
А начинаю гуглить и теряюсь в вариантах
DessanВиртуальная среда - это virtualenv. В питоне есть встроенная venv
какие-то совместимости, виртуальные среды разработки
DessanТы ничего не знаешь потому, что всё время Windows используешь, на которой ничего нет, так как это система для бухгалтерш, играющих в косынку, тогда как весь Интернет работает в основном на UNIX-подобных системах десятки лет. Да, есть много разного софта, который для Windows не делают и вряд ли когда-нибудь будут делать, так как система геморная сама по себе. Переходи на Linux, там у тебя будет всё. В Windows ты будешь, как слепой котёнок всё время, умеющий только в пасьянс играть.
И я никогда не имел дело с апачи и не очень люблю базы данных, потому что я их практически не знаю.
Отредактировано py.user.next (Март 29, 2020 21:33:11)
Офлайн