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

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

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

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

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

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

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

24
Эксперт Python
5438 / 3859 / 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
5438 / 3859 / 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
5438 / 3859 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru