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

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

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

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

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

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

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

24
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
28.09.2017, 17:55
TatiusWazo, А причем тут Python? Тебе надо брать apache or nginx и все.
0
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
28.09.2017, 19:49  [ТС]
alex925, это нужно на пайтоне написать, используя библиотеку сокет.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
28.09.2017, 20:29
TatiusWazo, Ну в этом случае предыдущее сообщение все равно не отменяется, web сервер в любом случае нужен.

Теперь следующий вопрос, зачем тебе писать вебню именно на сокетах? На сокетах пишут специфические вещи только (чаты и т д), вебню на голых сокетах не пишут.
0
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
28.09.2017, 22:12  [ТС]
alex925, такое задания дали и ты меня не совсем понимаешь, точней я не все рассказал.

В общем, суть задания:
Кликните здесь для просмотра всего текста
Написать веб-сервер, используя библиотеку socket
Программа должна предоставлять доступ к файлам в директории, из которой она была запущена.
Должна быть возможность ходить по директориям
При переходе на файл должно воспроизводиться его содержание


Т.е., я вроде и имею некую представленность как и что писать, но как все в купу сложить - нет.
Программирования учу вторую неделю только, наверное такое пишеться за пару часов, но я что-то в тупике.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
29.09.2017, 07:52
TatiusWazo, Ну тогда открываешь гугл и вперед. Матчасти там много, на форуме так не расскажешь все.
Вот пример простой статьи https://ruslanspivak.com/lsbaws-part1/ и подобных гуглится уйма https://www.google.com/search?... 40&bih=714
0
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
29.09.2017, 15:39  [ТС]
alex925, я все это читал уже)
Но, как мне реализовать именно ту часть, чтоб я мог перемещаться между папками, как на скриншоте, который я прикрепил в ОП посту?
Видел уроки с "directories walk", но они мне ничего не говорят, как реализовать это. Какой-то бы пример наглядный увидит.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.09.2017, 22:57
Лучший ответ Сообщение было отмечено TatiusWazo как решение

Решение

Простой веб-сервер с directories walk
Цитата Сообщение от TatiusWazo Посмотреть сообщение
Какой-то бы пример наглядный
Типа такого? :-)

Нарисовал так сказать just for fun...
Очень примитивный, без всяких css украшений и javascript примочек, а также должной обработки ошибок.
----------------------------------------
Ну если хочется
Цитата Сообщение от TatiusWazo Посмотреть сообщение
засесть и разбирать по строчке сам код.
то вот:-)

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
import time,os,sys
import socket
import mimetypes
from urllib.parse import quote,unquote
from subprocess import Popen
#для автоопределения кодировки файлов
from chardet.universaldetector import UniversalDetector
 
ENCODING = "utf-8"
 
 
def read_file(filepath,encoding):
    result = None
    detector = UniversalDetector()
    detector.reset()
    
    for line in open(filepath, 'rb'):
        detector.feed(line)
        if detector.done: break
    detector.close()
    encoding = detector.result.get('encoding') or encoding
    
    print("DETECT:",encoding)
    
    try:
        with open(filepath,encoding=encoding) as f:
            result = f.read()
    except:
        pass
    return result,encoding
 
def generate_html(root):
    
    answer = """<!DOCTYPE html>"""
    answer += """<html><head><title>%s</title>""" % root
    answer += """</head><body><h1>[%s]</h1><ul>"""  % root
    format = """
    <li><a  href='javascript: document.location.href=
"{proto}://{server}:{port}/{relpath}";'>{name}</a></li>
"""
    
    # сортировка файлов и директорий - первыми идут каталоги
    dirs  = []
    files = []
    for name in os.listdir(root):
        if os.path.isdir(os.path.join(root,name)):
            dirs.append(name.upper() + "/")
        else:
            files.append(name)
    
    dirs.sort()
    files.sort()
    dirs.extend(files)
    
    for name in dirs: 
        relpath = name                                              
        if root != ROOT:                                            
            relpath =  os.path.join(root.replace(ROOT,""),name)
        
        answer += format.format(proto="http",
                                server=SERVER, 
                                port=PORT,
                                root=root,
                                name=name,
                                relpath=quote(relpath.replace('\\','/').lstrip('/')))
    
    answer += """</ul></body></html>"""
    return answer
 
def send_answer(conn, 
                method="GET", 
                protocol = "HTTP/1.1", 
                status="200 OK", 
                charset="utf-8",
                typ="text/plain", 
                data=""):
    
    data = data.encode(charset)
    headers = [
        "{} {} {}".format(method, protocol, status),
        "Server: %s" % "simplehttp",
        "Connection: %s" % "close",
        "Content-Type: %s; charset=%s" % (typ,charset),
        "Content-Length: %s" % len(data),
       ]
    print('-' * 10) 
    print("RESPONSE:")
    for header in headers:
        conn.send(header.encode(ENCODING) + b"\r\n")     
        print(header)
    
    conn.send(b"\r\n") # после пустой строки в HTTP начинаются данные
    conn.send(data)
    
    
def route(conn, addr):# обработка соединения в отдельной функции
    data = b""
    
    while not b"\r\n" in data: # ждём первую строку
        tmp = conn.recv(1024)
        if not tmp:   # сокет закрыли, пустой объект
            break
        else:
            data += tmp
    
    if not data:      # данные не пришли
        return        # не обрабатываем
        
    udata = data.decode(ENCODING)
    print('-' * 10) 
    print('REQUEST:')
    print(udata.split("\r\n\r\n")[0]) 
    
    # берём первую строку из клиентского запроса
    udata = udata.split("\r\n", 1)[0]
   
    # разбиваем по пробелам 
    method, address, protocol = udata.split(" ", 2)
    #print(method, address, protocol)
   
    filepath = os.path.join(ROOT,address.strip('/').replace('/','\\'))
    typ,enc = mimetypes.guess_type(filepath)
    filepath = unquote(filepath)
    print('-'* 10)
    print(filepath,typ)
    
    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)
                        )
            
    
def main(server,port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((server, port))
    sock.listen(5)
 
    try:
        while 1: 
            conn, addr = sock.accept()
            print('-' * 10)
            print("Новое подключение: " + addr[0])
            
            try:
                route(conn, addr)
            
            except Exception as err:
                print(err)
                send_answer(conn, "500 Internal Server Error", data=str(err))
            
            finally:
                # закрываем сокет клиентского подключения
                conn.close()
    finally: 
        sock.close()
 
    
#--------------------------------------------------
if __name__ == "__main__":
    SERVER,PORT = "localhost",8080
    # корневая директория, которая будет доступна по адресу http://localhost:8080
    ROOT = os.path.dirname(__file__)
    
    main(SERVER,PORT)
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.09.2017, 01:44
Если добавить это перед 55 строкой - появится ссылка для перехода в родительский каталог
Python
1
2
3
4
5
6
7
8
    # добавляем в самый верх относительную ссылку на родительский каталог
    relpath = "/"
    if root != ROOT:
        relpath = os.path.dirname(root)                                             
        if relpath == ROOT: 
            relpath = "/"                                       
        else:
            relpath = relpath.replace(ROOT,"")
1
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
30.09.2017, 04:46  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Очень примитивный, без всяких css украшений и javascript примочек, а также должной обработки ошибок.
Именно такой и нужен, очень простой без всяких фич, максимально примитивный.

Очень благодарен, таки много есть разбирать
Возможно даже время от времени буду сюда что-то писать по вопросам. Еще и сколько новых библиотек)
Я думал, самый простой веб-сервер с моим заданием, где-то на 15-20 строчек. Моя серверная часть была написанная на 7 строк и мне говорили, что этого хватает)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.09.2017, 14:19
Цитата Сообщение от TatiusWazo Посмотреть сообщение
самый простой веб-сервер с моим заданием, где-то на 15-20 строчек
Вот http-сервер с листингом файлов\директорий на 4 строчки

Python
1
2
3
4
from http.server import HTTPServer, CGIHTTPRequestHandler
server_address = ("", 8000)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()
Но http.server это уже готовый модуль, который инкапсулирует все низкоуровневые детали работы с raw сокетами.
Кстати, стоит залезть в его внутренности, чтобы посмотреть - а как там все это реализовано. (Я и сам чего-то протупил - и не глянул.)

Сокеты это слишком низкий уровень - работа с байтовыми данными, которые помимо декодирования, потом еще и распарсить нужно. Поэтому коротко не выйдет. Впрочем, написать бесполезный ничего не делающий web-server на 7 строк вполне можно, но смысл :-)

Добавлено через 57 минут
P.S. Посмотрел код http.server и увидел некоторые свои ошибки и недочеты.
В частности, никакой javascript: document.location.href в ссылке для перехода нафиг не нужен. Достаточно наличия правильно сформированной относительной ссылки.

Добавлено через 4 минуты
То есть вместо строки 37 достаточно
Python
1
format = """<li><a  href="{name}">{name}</a></li>"""
Добавлено через 18 минут
В конечном итоге функция generate_html упрощается до такого варианта:
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
def generate_html(root):
    
    answer = """<!DOCTYPE html>"""
    answer += """<html>\n<head>\n<title>%s</title>\n""" % root
    answer += """</head>\n<body><h1>[%s]</h1><hr>\n<ul>"""  % root
    format = """<li><a  href="{name}">{name}</a></li>\n"""
    # сортировка файлов и директорий - первыми идут каталоги
    dirs  = []
    files = []
    for name in os.listdir(root):
        if os.path.isdir(os.path.join(root,name)):
            dirs.append(name.upper() + "/")
        else:
            files.append(name)
    
    dirs.sort()
    files.sort()
    dirs.extend(files)
    
    # добавляем в самый верх относительную ссылку на родительский каталог
    answer += format.format(name="../")
    
    for name in dirs: 
        answer += format.format(name=name)
    
    answer += """</ul>\n</body>\n</html>\n"""
    return answer
1
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
30.09.2017, 16:54  [ТС]
Garry Galler, пользоваться готовыми модулями в стиле SimpleHTTPServer не разрешали, но я не знал, что как-то можно посмотреть серединку модуля, как там все реализовано.

Цитата Сообщение от Garry Galler Посмотреть сообщение
Кстати, стоит залезть в его внутренности, чтобы посмотреть - а как там все это реализовано.
В общем, как посмотреть во внутренности, или это имелось ввиду зайти на документацию?
https://docs.python.org/3/library/http.server.html
Или имело ввиду, что такого такого плана https://hg.python.org/cpython/... PServer.py ?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.09.2017, 17:20
Цитата Сообщение от TatiusWazo Посмотреть сообщение
В общем, как посмотреть во внутренности, или это имелось ввиду зайти на документацию?
Именно в код модуля.
Документация требуется, если нужно просто использование модуля, а исходный код - для понимания того, как это работает.

Добавлено через 3 минуты
P.S. Исходный код модуля http.server находится в папке Lib\http.
1
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
30.09.2017, 19:39  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Впрочем, написать бесполезный ничего не делающий web-server на 7 строк вполне можно, но смысл :-)
Смысл в том, чтоб выполнить условия задачи :]
Так как я две недели только программирую, я еще тот нуб и вовсе не использую функции и какие либо проверки.
Все же, твой код я разобрал где-то на 30%.

К примеру, мой код смотрится как-то так:
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
47
48
49
50
import socket
import os
from os import getcwd
 
HOST, PORT = 'localhost', 5555
 
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print ('Serving HTTP on port %s ...' % PORT)
 
def make_tree(path):
    tree = dict(name=os.path.basename(path), children=[])
    try: lst = os.listdir(path)
    except OSError:
        pass #ignore errorse
    else:
        for name in lst:
            fn = os.path.join(path, name)
            if os.path.isdir(fn):
                tree['children'].append(make_tree(fn))
            else:
                tree['children'].append(dict(name=name))
    return tree
 
a = getcwd()
 
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
 
    http_response = """\
HTTP/1.1 200 OK
Content-Type: text/html
 
<!doctype html>
<title>Path: {{ a.name }}</title>
<h1>{{ tree.name }}</h1>
<ul>
{%- for item in a.children recursive %}
    <li>{{ item.name }}
    {%- if item.children -%}
        <ul>{{ loop(item.children) }}</ul>
    {%- endif %}</li>
{%- endfor %}
</ul>
"""
    client_connection.sendall(http_response.encode())
    client_connection.close()
И у меня не выходит вывести древо директорий как ссылки.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.09.2017, 19:45
Цитата Сообщение от TatiusWazo Посмотреть сообщение
И у меня не выходит вывести древо директорий как ссылки.
А как выходит?
Чтобы были ссылками - нужно использовать правильный html код с элементами <a> и атрибутами href.
А вот этого всего я не вижу. Тем более, что шаблон в переменной http_response работает только при использовании шаблонизаторов типа Jinja, а не сам по себе.
1
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
30.09.2017, 21:43  [ТС]
Garry Galler, да вообще никак не выходит.
Это задание с веб-сервером отбило у меня все желания с программированием, ибо такие жесткие тупняки пошли одним за одним (:
У меня вот даже не было понимания, что этот шаблон будет работать только с Jinja (не имею даже представления, что это).

Имея такой код, только чтоб вместо "Hello, World!" оно отображало список директорий и я мог кликать по ним (как ваша функция "def generate_html(root)"?)
Или тут все нужно переписывать?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import socket
 
HOST, PORT = '', 8888
 
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print('Serving HTTP on port %s ...' % PORT)
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    print(request)
 
    http_response = """\
HTTP/1.1 200 OK
 
Hello, World!
"""
    client_connection.sendall(http_response.encode())
    client_connection.close()
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.09.2017, 23:41
Цитата Сообщение от TatiusWazo Посмотреть сообщение
все нужно переписывать?
http_response написать правильно. Цикл по файлам делается отдельно и затем конкатенируется к основной переменной. Образец есть.

Цитата Сообщение от TatiusWazo Посмотреть сообщение
Jinja (не имею даже представления, что это).
Движок распознающий шаблоны и генерирующий из них конечный html. Существует их много, но синтаксис у всех похож.

Цитата Сообщение от TatiusWazo Посмотреть сообщение
Это задание с веб-сервером отбило у меня все желания с программированием,
Программирование (его изучение и применение) ныне это последний этап. А начинать нужно с технологий, которых с середины 20-го века появилось дофига: TCP-IP\WEB\UNIX SOCKETS\HTML\XML\CSS\JSON\AJAX\MVC\Базы данных и еще штук 20 только самых основных... Без их понимания заниматься не "hello world" программированием невозможно.
1
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
01.10.2017, 02:59  [ТС]
Garry Galler, потратил 2 часа, чтоб понять, что такое сокеты (а то раньше просто понимал, что это какой-то мостик между двумя процесами, которые между собой соединяются) и начал лучше понимать логику вашего кода, но все равно далеко от идеала.

1. Создаем сокет.
def main(server, port) - тут мы создаем сокет:
socket - Создаем сокет.
bind - Привязываем к нему IP и порт.
listen - Объявляем, что готовы принимать соединения.

У меня это:
Python
1
2
3
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
2. Установка соединения и передача данных?
def route(conn, addr) - устанавливаем соединения и отправляем данные с сети?
receive - tmp = conn.recv(1024) - получаем данные с сети в 1кб.
а остальное уже связанное как раз с отображением generate_html, да?
в общем, def route я не совсем понял, вроде и все просто, но одновременно очень запутано для меня, так как нужно отлично понимать ту часть кода, которая до него встречается.

У меня это:
Python
1
2
3
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
3. Передача данных.
def send_answer(conn, method="GET", protocol="HTTP/1.1", status="200 OK", charset="utf-8", typ="text/plain", data="") - отправка данных.
Я так понимаю, тут мы делаем читабельной формат верхних аргументов?

У меня это:
Python
1
2
3
4
5
http_response = """\
    HTTP/1.1 200 OK
    
    """
        client_connection.sendall(http_response.encode())
4. Закрыть сокет.
Это у нас в def main(server, port) происходит.

У меня это:
Python
1
client_connection.close()
Еще где-то с 2 часа пробовал экспериментировать со своим http_response используя ваш def generate_html, но пока без успеха.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.10.2017, 14:57
Посмотри функцию list_directory в http.server.py - там все сделано по тому же принципу что и у меня, только вместо конкатенации используется массив строк, которые затем соединяются в одну посредством join, кодируются в байты и отправляются клиенту(браузеру).

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
...        
        r.append('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
                 '"http://www.w3.org/TR/html4/strict.dtd">')
        r.append('<html>\n<head>')
        r.append('<meta http-equiv="Content-Type" '
                 'content="text/html; charset=%s">' % enc)
        r.append('<title>%s</title>\n</head>' % title)
        r.append('<body>\n<h1>%s</h1>' % title)
        r.append('<hr>\n<ul>')
        for name in list:
            fullname = os.path.join(path, name)
            displayname = linkname = name
            # Append / for directories or @ for symbolic links
            if os.path.isdir(fullname):
                displayname = name + "/"
                linkname = name + "/"
            if os.path.islink(fullname):
                displayname = name + "@"
                # Note: a link to a directory displays with @ and links with /
            r.append('<li><a href="%s">%s</a></li>'
                    % (urllib.parse.quote(linkname,
                                          errors='surrogatepass'),
                       html.escape(displayname)))
        r.append('</ul>\n<hr>\n</body>\n</html>\n')
        encoded = '\n'.join(r).encode(enc, 'surrogateescape')
...
0
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 35
02.10.2017, 17:07  [ТС]
Garry Galler, что ж, все до сих пор без результатов.
Какой-то прогресс даже был, ссылки генерировались, но их не можно было открыть в браузере (код был до усрачки кривой с множеством костылями, как не крути).
Если у вас будет время и желание над этим посидеть, буду благодарен, если еще раз посмотрите.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import socket
import os
 
server = ''
port = 8888
directory = '/'
 
def generate_html(root):
    answer = '''HTTP/1.0 200 OK
Content-Type: text/html
'''
    answer += """<!DOCTYPE html>"""
    answer += """<html><head><title>%s</title>""" % root
    answer += """</head><body><h1>[%s]</h1><hr><ul>""" % root
    format = """<li><a  href="{name}">{name}</a></li>"""
 
    dirs = []
    files = []
    for name in os.listdir(root):
        if os.path.isdir(os.path.join(root, name)):
            dirs.append(name.upper() + "/")
        else:
            files.append(name)
 
    dirs.sort()
    files.sort()
    dirs.extend(files)
 
    #кнопка назад
    answer += format.format(name="../")
 
    for name in dirs:
        answer += format.format(name=name)
 
    answer += """</ul></body></html>"""
 
    # эскиз как вроде должен смотреться переделанный generate_html = = = = = = = = = = = = = 
 
    информацию_которую_нужно_вставить_1 = 'информацию которую нужно вставить 1'
    информацию_которую_нужно_вставить_2 = 'информацию которую нужно вставить 2'
 
    новый_ответ = '''HTTP/1.0 200 OK
        Content-Type: text/html
 
        <html>
        <head>
        <title>Success</title>
        <meta charset="utf-8">
        </head>
        <body>
        ''' + информацию_которую_нужно_вставить_1 +'''
        <hr>
        '''+ информацию_которую_нужно_вставить_2 +'''</div>
        <br>
        </body>
        </html>
        '''
    # = = = = = = = = = = = = = = = = = = = = =
 
    return новый_ответ.encode('utf-8')
 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((server, port))
server_socket.listen(1)
while True:
    client_connection, client_address = server_socket.accept()
    request = client_connection.recv(1024)
 
    client_connection.sendall(generate_html(directory))
    client_connection.close()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2017, 17:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru