Уведомления

Группа в Telegram: @pythonsu

#1 Март 27, 2020 16:41:51

Dessan
Зарегистрирован: 2019-10-16
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

Добрый день,

Не знаю в какую сторону копать гранит науки, подскажите. Мне нужно, чтоб 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
и серверная часть прекрасно его принимает и создаёт из них ассоциативный список (словарь), но я не знаю как сделать, чтоб отображалась html страница ещё и при этом:
 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>"
И как мне потом всунуть логин и пароль в нужные мне теги этой страницы?

Офлайн

#2 Март 27, 2020 18:06:11

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2683
Репутация: +  182  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

> Не знаю в какую сторону копать гранит науки

Копай в сторону веб-фреймворков.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Март 27, 2020 19:43:46

Dessan
Зарегистрирован: 2019-10-16
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

Спасибо, копаю в сторону DJANGO, но пока что вижу только как создавать сайты, а как сервер построить не вижу. Как мне правильно сформулировать запрос для поисковиков? А то боюсь, что даже найдя что-то нужное, я могу это нужное не распознать и закрыть

Офлайн

#4 Март 28, 2020 02:57:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

Используй 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)

Офлайн

#5 Март 28, 2020 08:23:25

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

Dessan
Мне нужно, чтоб html страница на одном компьютере обрабатывала локальные мои запросы к ней с другого компьютера и изменяла своё содержимое соответственно.

Давайте по порядку, чтобы начать говорить на одном языке.

1. html это язык разметки он ПРИНЦИПИАЛЬНО НЕ ОБРАБАТЫВАЕТ запросы. Запросы может обработать программа которая вам показывает страницу с разметкой html. Это может быть браузер, или ваша GUI произвольная программа в которой предусмотрено отображение html разметки.
2.
Dessan
но пока что вижу только как создавать сайты, а как сервер построить не вижу
В рамках данного обсуждения создать веб сервер и создать создать веб сайт это синонимы.
3. Вам надо чтобы сторона с html обрабатывал запросы одного компьютера. Веб устроен полностью наоборот там один компьютер обрабатывает запросы множества машин которые отображают результаты в html. Есть технологии которые это преодолевают (websocket например), но чтобы построить такую систему вам надо сначала глубоко изучить сайтостстроение, а уж потом построить то что вам совсем не нужно.

Напрашивается вывод что вам не нужны flask dgango и все прочие веб технологии (у вас передача сообщений в другую сторону и вам не нужно обслуживать множество клиентов). Вам надо построить свою GUI программу, которая будет сервером и будет отображать состояние пользуясь html разметкой (хотя я в этом случае не понимаю зачем вам html поскольку без него все будет гораздо проще). Возьмите wxPython или Qt и сделайте так как вам надо. Они поддерживают и html контролы.



Офлайн

#6 Март 28, 2020 09:47:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

doza_and
Напрашивается вывод что вам не нужны flask dgango и все прочие веб технологии (у вас передача сообщений в другую сторону и вам не нужно обслуживать множество клиентов). Вам надо построить свою GUI программу, которая будет сервером
Он же привёл пример на модуле http, где он не знает только, как изменить ответную html-страницу (не знает про str.format() ). Потом он пытается изобрести шаблонизатор.

То есть тут нужен Flask потому, что ему нужно только брать параметры HTTP-запроса и использовать их в странице HTTP-ответа. А Django ему не нужен, потому что у него микроскопический проект, в котором нет никакого сайта даже близко.

doza_and
Вам надо построить свою GUI программу, которая будет сервером и будет отображать состояние пользуясь html разметкой
А с GUI он получит не только ограничение на использование этой программы потом (не сможет её поставить в сети и использовать удалённо), так ещё и протокол обмена ему придётся изобретать, вместо того, чтобы взять уже готовый протокол HTTP. Если он откроет сокет, протокол там сам по себе не появится, его надо будет имплементировать.



Отредактировано py.user.next (Март 28, 2020 09:51:37)

Офлайн

#7 Март 28, 2020 19:11:12

Dessan
Зарегистрирован: 2019-10-16
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

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 я в состоянии. Представим, что у меня уже есть красивая страница с кучей кода, различными вкладками, кнопками, окнами и я хочу заходить на эту страницу с любого устройства по локальной сети: планшет, мобильный, телевизор, ноутбук и т.д. и видеть все изменения на ней, а также иметь возможность пользоваться вкладками, окнами, кнопками и т.д.

Наверно, более детально описать у меня не получится. Как бы вы реализовали мою задумку?

Офлайн

#8 Март 28, 2020 22:26:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

Dessan
Я не слышал даже о wxPython и Qt, обязательно ознакомлюсь.
Без опыта ты на них ничего приемлемого не напишешь, даже на чистом формошлёпстве в Qt Designer'е. Тебе придётся понимать, как они работают, а для этого надо книжку прочитать (особенно про Qt, в котором сигналы и слоты не такие уж и интуитивные; методом тыка ты их не поймёшь). К тому же понадобится асинхронная архитектура приложения, в которой ты, конечно же, тоже не шаришь. Это придётся сначала несколько программ асинхронных написать, чтобы понять, как их вообще писать, и применить потом это понимание в рабочей программе, которая нужна, а не просто для учебной тренировки делается.

Dessan
у нас локальная сеть с компьютерами и телефонами, никакой интернет мне не нужен на данном этапе
Да, поначалу много чего не надо. А потом раз и поменялись условия и сеть разносится сначала между разными зданиями, а потом и между разными городками, а потом её вообще подключать нужно к какому-нибудь федеральному центру. Всё это играет роль, когда ты стоишь перед выбором: либо использовать уже написанную одну программу, либо писать три новых программы и ещё неизвестно, когда они будут готовы и кто их вообще писать будет, за сколько миллионов и напишет ли вообще в итоге. Так что такие вещи сразу нужно продумывать, когда даже ничего нет ещё.

Dessan
о str.format() знаю, но не представляю как его применить для моих целей.
Я и говорю, что ты пытаешься шаблонизатор написать, который уже написан, - Jinja. Он хорошо развит и он бесплатный. Его можно переизобрести и использовать всё то же самое, только через str.format() делать. Получится, конечно, не шаблонизатор, а что-то похожее на шаблонизатор. Но оно получится хуже в сто раз и поплывёт при первом же изменении требований.

Dessan
пусть это будет IP камера, которая может отправлять get запросы и принимать get запросы. Ее задача отправлять отправлять get запрос с положением своей позиции и сигнал тревоги при обнаружении движения и принимать get запросы для изменения своей позиции
Ты не будешь отправлять это “окну” или “из окна”. Ты будешь отправлять это службе (абстрактно говоря, потому что “службу” ты можешь и как программу запустить, хотя при стандартных условиях для этого делается служба в операционной системе). И служба у тебя обрабатывает все запросы и посылает ответы. А окно, гуишное оно или браузерное, оно просто у этой службы спрашивает “какая там сейчас ситуация у тебя в базе данных, покажи мне, а я отображу на экране это в красивом виде”.

Вот такая архитектура должна быть. Тогда ты и окон можешь делать много разных. Можешь сделать и гуишное, и браузерное, и оттранслировать это дальше, в какую-нибудь базу данных для обработки этих данных другими программами.

Dessan
Наверно, более детально описать у меня не получится. Как бы вы реализовали мою задумку?
На Flask'е ты это всё построишь быстрее всего. И его реально изучить быстро. Сайтом тут и не пахнет, поэтому Django - платформа для создания CMS'ок, которые управляют сайтами, - тут вообще не нужна, потеряешь только время на её изучение и не будешь использовать потом 50% изученного.

То, что можно всю эту систему построить на открытом сокете, возможно, но это вариант для условий, в которых Flask запрещён. Строить это на сокете - это всё равно что строить это на модулях http и cgi - ты просто потратишь время на реализацию протокола общения между компонентами системы, а результат будет хуже и многостраничнее, чем на Flask'е, где всё это пишется в пределах нескольких строк. Сам Flask позволяет приложение запустить без сервера, само по себе как сервер, и открывать его в браузере на localhost:5000 , но это используется для отладки приложения, пока ты его разрабатываешь. Для работы же нужно поставить сервер и на нём запустить это приложение на Flask. Серверы защищены от несанкционированного доступа в разные места, а приложение на Flask в стиле “я само себе сервер” - нет, так как это не задача для Flask.

Поэтому изучай Flask, сделай страничку hello world , открой её в браузере без установки сервера, и ты поймёшь, что это то, что нужно.



Отредактировано py.user.next (Март 28, 2020 22:33:31)

Офлайн

#9 Март 29, 2020 19:46:44

Dessan
Зарегистрирован: 2019-10-16
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

Начитался я этого 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()"
А начинаю гуглить и теряюсь в вариантах…какие-то совместимости, виртуальные среды разработки…Версия питона 3.7.3 и никаких других версия не стоит.

Офлайн

#10 Март 29, 2020 21:30:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Создание и редактирование web содержимого на Python

Dessan
А начинаю гуглить и теряюсь в вариантах
Для Windows используют Waitress вместо Gunicorn.

https://flask.palletsprojects.com/en/1.1.x/tutorial/deploy/
https://stackoverflow.com/questions/11087682/does-gunicorn-run-on-windows

Dessan
какие-то совместимости, виртуальные среды разработки
Виртуальная среда - это virtualenv. В питоне есть встроенная venv
https://docs.python.org/3/library/venv.html

Можешь ставить Waitress в виртуальную среду, разобравшись с виртуальной средой сначала (она не сложная). Можешь ставить без виртуальной среды сразу через pip. Для твоего случая большой разницы нет, как делать.


Dessan
И я никогда не имел дело с апачи и не очень люблю базы данных, потому что я их практически не знаю.
Ты ничего не знаешь потому, что всё время Windows используешь, на которой ничего нет, так как это система для бухгалтерш, играющих в косынку, тогда как весь Интернет работает в основном на UNIX-подобных системах десятки лет. Да, есть много разного софта, который для Windows не делают и вряд ли когда-нибудь будут делать, так как система геморная сама по себе. Переходи на Linux, там у тебя будет всё. В Windows ты будешь, как слепой котёнок всё время, умеющий только в пасьянс играть.



Отредактировано py.user.next (Март 29, 2020 21:33:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version