LINUX.ORG.RU

python3 — web-servers с http.server без классов — возможно ли?

 ,


0

1

Привет.

Я хочу написать веб-сервер без классов. Вот пример с классами: http://pbcraft.ru/simple-python3-web-server/

Вот мои тщетные попытки реализовать это без классов:

#!/usr/bin/python3
import http.server

server_address=('127.0.0.1', 777)


def return_patching_schedule(request, client_address,server):
    print(request)
    http.server.BaseHTTPRequestHandler.send_response(code=200)

my_server=http.server.HTTPServer(server_address=server_address, RequestHandlerClass=return_patching_schedule)
my_server.serve_forever()

Само собой, не работает, в функции http.server.BaseHTTPRequestHandler.send_response не хватает аргумента self:

TypeError: send_response() missing 1 required positional argument: 'self'

Что писать вместо self? И как вообще вывести в принципе параметры get-запроса? Или обязательно нужны классы?

Просто я не очень умный и не хочу классы осваивать.

Спасибо заранее.

★★★

Последнее исправление: iljuase (всего исправлений: 1)

Ответ на: комментарий от hippi90

Мне попроще надо что-нибудь.

Цель — просто веб-сервер, который будет принимать get-запросы, делать запрос к базе данных на sqlite и возвращать ответ.

iljuase ★★★
() автор топика
Ответ на: комментарий от vvn_black

Понял, это невозможно...

Есть тогда какая-нибудь аналогичная библиотека для python, которая позволит создать веб-сервер без классов? Я хочу только функции.

iljuase ★★★
() автор топика

Просто я не очень умный и не хочу классы осваивать.

Там разбираться минут 30. Ну или не разбираясь отредактировать хеловорд под свои задачи (в примере по ссылке понимание ООП нужно на уровне «не впасть в кому от шока, заметив что функция засунута внутрь какой-то неведомой шняги и вебсерверу скармливается эта шняга, а не сама функция»)

MrClon ★★★★★
()
Ответ на: комментарий от iljuase

Похоже ты взял не тот инструмент. Говорят, что в Go есть хорошие встроенные библиотеки для работы с http и ты можешь попробовать на нём написать желаемое (процесс сервер, который принимает соединения и отвечает)

По делу — в python всё есть какой нибудь, да класс, так что без них никак.

conformist ★★★
()

И ещё ремарка, а зачем тебе какая-то хаутушка, когда в официальной доке как раз всё «без классов».

https://docs.python.org/3/library/http.server.html

update. Кстати, пример сервера оттуда GET-запросы в консольку печатает.

$ python server.py
serving at port 8080
127.0.0.1 - - [16/Dec/2017 23:56:49] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [16/Dec/2017 23:57:26] "GET /?action=1 HTTP/1.1" 200 -
127.0.0.1 - - [16/Dec/2017 23:57:49] "GET /?action=1&command=2 HTTP/1.1" 200 -
vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 2)

Всем спасибо за отклики.

Я перестану быть упрямым ослом и начну использовать эти классы, хотя я их презирал и ненавидел на протяжении пяти лет и как-то умудрялся их избегать. Но пора меняться.

iljuase ★★★
() автор топика
Ответ на: комментарий от iljuase

Ты, главное, пиши уже сразу на 3-ем питоне :) классы в питоне просты и удобны, не надо ссать в тапки.

menangen ★★★★★
()

без классов

Нет никакого смысла так изгаляться.

Просто я не очень умный и не хочу классы осваивать.

Нестоит думать, что все сразу сходу всё подхватили из документации и кодить начали. Тоже шли своим путём, пробираясь через непонимание :)

th3m3 ★★★★★
()
Последнее исправление: th3m3 (всего исправлений: 1)
Ответ на: комментарий от iljuase

хотя я их презирал и ненавидел на протяжении пяти лет и как-то умудрялся их избегать

Мне аж интересно посмотреть код который ты написал за эти 5 лет

Siado ★★★★★
()
Ответ на: комментарий от iljuase
def create_csv_list_with_servers_for_write_and_with_additional_monitors

Вот это я понимаю. А то любят тут некоторые поворчать на короткие, ничего не значащие имена переменных

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от makoven

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

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

И тем не менее

А что тем не менее? module-scoped globals очень удобная штука. Я их регулярно юзаю. В том числе в качестве settings.py паттерна. Типа

# __init__.py
from core import Db, Config

global DB, CONFIG

def init():
    global DB, CONFIG
    DB = Db('database.sqlite')
    CONFIG = Config('config.json')


# main_module.py
from . import init
init()


# other_modules.py
from . import DB, CONFIG
makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от makoven
# __init__.py
from core import Db, Config

def init(db, cfg):
    Db(db)
    Config(cfg)


# main_module.py
from . import init
init('database.sqlite', 'config.json')


# other_modules.py
from . import init
init('database.sqlite', 'config.json')

А можно так. То есть импортируем init() где надо

Хотя таки странный у тебя пример, зачем нужны данные подключения другим модулям, может сразу функцию коннекта написать в __init__.py ?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 5)
Ответ на: комментарий от Deleted

То есть импортируем init() где надо

А смысл? Вызов init не импортирует в текущий модуль глобальные переменные, определенные в init()

Кроме того sqlite и так не очень «многопользовательская». Как-то глупо создавать по новому подключению к БД в каждом модуле, который желает поработать с БД. Хотя, конечно, можно запердолить синглтон

зачем нужны данные подключения другим модулям, может сразу функцию коннекта написать в __init__.py

Во-первых, потому, что в реальности вызов Db может быть таким:

DB = Db(CFG['db_path'], Path(sys.path[0]) / 'sql_files')
таскать такое в каждый модуль неразумно

Во-вторых, проект можно стартовать через разные файлы (например, python3 project/tui.py, python3 project/web,py, etc) и где-то все-равно придется держать функцию инициализации всякого хлама. Вместо __init__.py логичнее поместить это в settings.py, но последний оккупировала джанга :)

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 5)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.