Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35

Простой веб-сервер с directories walk

28.09.2017, 17:31. Показов 4152. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, на просторах инета уже многовато поискал информации, но сложновато все структуризировать и создать свой план действия. Смотрим скриншот, что мне нужно. Дальше я бы хотел услышать как мне лучше всего это сделать. Возможно у вас даже есть ссылки на готовое, чтоб можно было засесть и разбирать по строчке сам код.
Миниатюры
Простой веб-сервер с directories walk  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2017, 17:31
Ответы с готовыми решениями:

простой веб-сервер
Добрго времени суток! Написал простой веб-сервер. Возникли трудности с обменом данных по протоколу HTTP. Вот мой код с раскрытыми функциями...

Простой веб сервер
Хотел написать в продолжении этой темы, но потом решил создаь отдельную тему. В прикреплении проект веб сервера и его исполняемые файлы....

простой веб сервер
Подскажите плз, где найти литературу, как создать простой веб сервер. В принципе примеры я нашел, но хотел бы почитать объяснение. Есть...

24
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
02.10.2017, 18:56
Студворк — интернет-сервис помощи студентам
TatiusWazo,
Не пытайтесь писать так как хочется. Пример и так упрощен - если его еще больше упрощать - лучше не будет.
Попытайтесь сделать его лучше: разбейте код на небольшие подфункции (код получения списка файлов лучше оформить в отдельную функцию), где каждая будет выполнять свою маленькую подзадачу - так проще будет потом ориентироваться в коде и понимать, где баг, а где фича. :-) Не лепите в одну строку код формирования заголовков ответа и код данных (html) - по RFC2616(Hypertext Transfer Protocol) заголовки разделяются символами перевода строки, а данные отделяются от заголовков двумя (ну или хотя бы одним) символами перевода строки.
Они у вас в строке answer, конечно, есть, но явно не обозначены и изменив формат raw строки легко и вовсе потерять их.

В конечном итоге, если этот код довести до ума - получится... Flask или Bottle :-) (это такие готовые микрофреймворки для web, где не нужно думать над низоуровневыми вещами).

Цитата Сообщение от TatiusWazo Посмотреть сообщение
но их не можно было открыть в браузере
Значит код роутинга (получение маршрута запроса и ответ на него) был неправильно написан. Либо сгенерированный html код был с ошибками. Нужно в браузере всегда открывать страницу (Ctrl+U) и смотреть что получилось.
1
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
02.10.2017, 21:05  [ТС]
Garry Galler, кстати, я так и не совсем разобрался с этим.
Python
1
2
b""
b"\r\n"
\n - это с новой строчки, а остальное?
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
02.10.2017, 21:57
b"" - просто пустая строка (байтовая). b"\r\n" - перевод строки (в байтах).
Разница есть для конкретной системы: на windows перевод строки обозначается как "\r\n", на Linux - "\n", на Mac - "\r". Впрочем, python всю эту разницу нивелирует.
1
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
02.10.2017, 23:18  [ТС]
1
Не понял, что за rb.
Python
1
for line in open(filepath, 'rb'):
2
Python
1
method, address, protocol = udata.split(" ", 2)
Что-то не могу врубаться, что эта строчка делает, так как в этой функции нету method и protocol. Только используется address. Решил поэкспериментировать:
Остановил только: address = udata. Стало отображать такое:

3
Python
1
2
3
    filepath = os.path.join(ROOT, address.strip('/').replace('/', '\\'))
    typ, enc = mimetypes.guess_type(filepath)
    filepath = unquote(filepath)
Тут не могу понять, почему мы начали писать ROOT с большой буквы. Это тоже самое, что и generate_html(root)?
И mimetypes, unquote не знаю, для чего используем (но, я еще и не гуглил).

4
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    if address == "/":
        answer = generate_html(ROOT)
        return send_answer(conn,
                           typ="text/html",
                           charset=ENCODING,
                           data=answer)
    else:
        if os.path.exists(filepath):
            if os.path.isdir(filepath):
                answer = generate_html(filepath)
                send_answer(conn,
                            typ="text/html",
                            charset=ENCODING,
                            data=answer)
 
            # если файл имеет читабельное текстовое содержимое - выводим его
            elif typ == "text/plain":
                text = None
                error = 'None'
                try:
                    text, charset = read_file(filepath, encoding=ENCODING)
                except Exception as err:
                    error = str(err)
 
                if text is not None:
                    send_answer(conn, typ=typ, charset=charset, data=text)
                else:
                    send_answer(conn,
                                status="500 Internal Server Error",
                                data="|".join([error, filepath]))
            # если файл не типа text/plain
            else:
                # пробуем открыть его в программе по умолчанию
                Popen(filepath, shell=True)
                # генерируем заново список файлов в этом каталоге
                answer = generate_html(os.path.dirname(filepath))
                send_answer(conn,
                            typ="text/html",
                            charset=ENCODING,
                            data=answer)
        # если файла не существует
        else:
            send_answer(conn,
                        status="404 Not Found",
                        data="File not Found:{}".format(filepath)
                        )
Если можно поподробней эту часть расписать, а то я не могу визуализировать, что происходит у меня в браузере. Даже с этими коментарями как-то глуховато.

Что я понял с этого. На интуитивном уровне понимаю, что есть некие проверки в стиле status="500 Internal Server Error" и status="404 Not Found", где 404 выбивает, если я захочу ввести в url которого нет. А в от с 500 не могу понять, что мне сделать, что мне выбила эта ошибка.

Popen - читал, но не вшарил.

5
Последнее, что я не понял, как оно узнает, в какой директории я есть? Т.е., имею ввиду, я думал, где-то будет использоваться getcwd, но он тут нигде не используется.

Добавлено через 50 минут
И да!
Если сервак долго включен и потом его обновить, выбивает вот такое:

protocol, address, method = udata.split(" ", 2)
ValueError: not enough values to unpack (expected 3, got 1)
Просто интересно, что это означает.
Пишет, что значения не хватает, но почему так происходит?
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.10.2017, 01:04
Цитата Сообщение от TatiusWazo Посмотреть сообщение
Не понял, что за rb
1)Бинарный режим открытия файла.

Цитата Сообщение от TatiusWazo Посмотреть сообщение
method, address, protocol = udata.split(" ", 2
2) Что мы отправляем клиенту первой строкой в заголовках?
method, protocol, status
GET HTTP/1.1 200 OK
Что мы получаем от клиента в первой строки заголовков?
method, address, protocol
GET /путь_к_ресурсу_относительно_корня HTTP/1.1
Кроме адреса нас ничего не интересует поэтому используем только address.
Способ получения этих данных из байтов может быть любой. В данном случае используется просто split по пробелам первой строки и распаковка на три переменные.

Цитата Сообщение от TatiusWazo Посмотреть сообщение
А в от с 500 не могу понять, что мне сделать, что мне выбила эта ошибка.
Если будет ошибка в скрипте (то есть на уровне сервера\бэкенда) - тогда и будет 500. По спецификации протокола http ошибки уровня 5xx зарезервированы для обозначения внутренних ошибок сервера. Мы сами, конечно, можем написать любую другую - но нас не поймут :-)
Стандарт есть стандарт.

Цитата Сообщение от TatiusWazo Посмотреть сообщение
Popen - читал, но не вшарил.
Метод для запуска любого файла как программы. В скрипте используется просто так - на самом деле можно не использовать.

Цитата Сообщение от TatiusWazo Посмотреть сообщение
ак оно узнает, в какой директории я есть?
5)
Python
1
2
# это  директория нашего скрипта;  __file__ - это специальная встроенная переменная показывающая полный путь до нашего скрипта
ROOT = os.path.dirname(__file__)
Это и есть корневой путь нашего сайта. Ну, у нас же типа сайт такой в виде explorer'а :-)
Цитата Сообщение от TatiusWazo Посмотреть сообщение
почему мы начали писать ROOT с большой буквы
Это отдельная глобальная переменная, поэтому и с прописаной буквы.
А в функцию genereate_html передается сначала (первый запуск) - ее значение (то есть нашего корня), а затем уже -
при листинге директорий - субдиректории.

Цитата Сообщение от TatiusWazo Посмотреть сообщение
Если сервак долго включен и потом его обновить, выбивает вот такое:
Не знаю - надо проверить. У меня такой ошибки не было.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2017, 01:04

Простой веб-сервер
Добрый день, подскажите плиииз. Тяжело ли на Лазарусе на определенном порту "поднять" простой web-server? Обмен...

Как написать простой веб сервер
Доброго времени суток. Цель: разгрызть веб, написав программу-веб сервер. Суть: С браузера клиента захожу на IP сервера. Тот отправляет...

Простой веб-сервер: не могу найти ошибку
Добрый день пытаюсь написать веб-приложение на node.js, только начал изучать. Что я делаю не так? Файл say.js const os =...

Посоветуйте простой веб сервер для картинок
Здравствуйте, посоветуйте пожалуйста кто сталкивался. Нужно установить простой веб сервер на домашнем ПК, цель - залить туда терабайт...

Решить проблему: простой веб сервер на основе boost::asio падает именно при первом же обращении к серверу
Запускаю код указанный ниже, но при обращении на айпи и порт который слушает сервер, сервер падает (debug error, abord) А браузер пишет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru