LINUX.ORG.RU

ищется минималистичный key-value-ориентированный скрипт для мгновенного построения веб-интерфейса, сохраняющего результат в виде текста

 ,


0

1

возможно, что есть что-то готовое, но слегка не такое, или возможен лучший дизайн, или откуда-то этот код можно выдрать — так что вперед

цель: мгновенно делать веб-интерфейсы, причем:

1. схемы данных нет и на следующий день (для тех же данных) она будет совсем другая, поэтому нужно результат получать в виде key-value

2. не хочется ничего устанавливать в систему

как я это вижу: запускается скрипт (который я так же буду называть сервером)

/path/to/script/key-value-server 127.0.0.1:8080 /home/username/my_file.txt

скрипт читает все записи файла /home/username/my_file.txt, парсит их как значения «key»:«value», выбирает *последнее* значения для каждого ключа как текущее значение, и затем вешается на порт 8080 и выдает http-ответы (какие — см. ниже)

ручками или каким-то третьим скриптом я генерирую статический html-файл например такой:

<html><head><script src="http://127.0.0.1:8080/main.js"></script></head>              
<body onLoad="main_on_load()"><form>                                                                          
<input type=checkbox name=foo123>                                                     
<input type=text name=bar456>
</form></body></html> 

и открываю его в браузере

что делает main.js:

1. сразу после загрузки оббегает все элементы всех форм на странице и пытается получить их значения от сервера, выдавая запросы вида

http://127.0.0.1:8080/get_value?name=foo123
http://127.0.0.1:8080/get_value?name=bar456

2. если значения получены, заполняет ими элементы формы; если нет, то запоминает значение элементов формы по умолчанию

3. каждую секунду оббегает все элементы всех форм на странице, и если чье-то значение поменялось — например, был напечатан тексте hello в текстовом поле — выдает запрос http://127.0.0.1:8080/set_value?name=bar456&value=hello — хотя, возможно, post-запрос все же лучше

сервер, получив запрос http://127.0.0.1:8080/set_value?name=bar456&value=hello, дописывает скажем строчку

"bar456":"hello"

в файл /home/username/my_file.txt, и на время сессии запоминает, что значением ключа «bar456» являет «hello»

если через секунду в поле «bar456» появится «hello world», то все повторяется уже с ним, и сервер отдает уже не «hello», а «hello world» при обращении http://127.0.0.1:8080/get_value?name=bar456  — так что в принципе, дешево и сердито, с этими данными могут работать и несколько клиентов (в т.ч. и по сети, если не 127.0.0.1)

специально уточню, что:

1. всю форму сабмитить не предполагается (кнопки сабмит вы не зря не видите), хотя это возможно как дополнение

2. почему каждую секунду, а не onChange? менее затратно, по-моему — хотя если можно сделать чтобы скрипт на onChange не вис при вставке 100 кб текста в поле — можно и onChange

3. никаких проверок целостности данных и отсутствия гонок не предполагается

4. в системе не должно требоваться наличие веб-сервера

5. как дополнение, возможна запись в /home/username/my_file.txt с тайм-штампом, скажем

{ "time_stamp":"2016.07.05 12:01:01", "bar456":"hello" }

6. как дополнение, возможно не затирание прошлого value, а конкатенация с ним через разделитель, типа конца строки или <p> (но это надо как-то записать в форме)

7. не обязательно скрипт, можно и статически слинкованный бинарник (хотя я подозреваю, что его иногда придется править по-живому)

этого в принципе хватит, чтобы мгновенно сделать веб-интерфейс; а результаты из файла /home/username/my_file.txt можно доставать каким-то своим скриптом по мере надобности

в принципе такое можно свелосипедить на php, python, erlang - у всех имеются встроенные средства, [веб-][серверы]

anonymous ()
Ответ на: комментарий от anonymous

да я даже начал велосипедить почти такое на перле (разница в том, что он у меня запускается из-под inetd — мне влом было делать именно standalone, да и еще кое-какие углы срезал по-наглому), но потом решил, что мысль, должно быть, не нова, и лучше поискать готовое и standalone

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

под 300 скорее

и хотя я тут и прибеднялся, но в отличие от того, что я тут написал, у меня клиенты висят на сервере (т.е. он стримит) — так, по-хорошему, и надо делать

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

мне влом было делать именно standalone

на перле не проблема standalone сделать, тупейший вариант - на HTTP::Daemon

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

Если имеется в виду Transfer-encoding: chunked, то да, конечно.

Для чего-то более серьезного я бы все-таки посоветовал взять хотя бы голый Plack, но для совсем простых вещей у HTTP::Daemon есть пара достоинств: 1) в plack придется вкуривать кучу вещей, прежде чем ты сможешь запустить приложение; 2) HTTP::Daemon практическе в любом дистрибутиве можно поставить из репов, а вот plack в centos <= 6 в репах нет совсем никакого

annulen ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.