Создание динамических страниц с помощью Lua, Пишем сайты на Lua |
Здравствуйте, гость ( Вход | Регистрация )
Создание динамических страниц с помощью Lua, Пишем сайты на Lua |
15.3.2011, 4:11
Сообщение
#1
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Бытует мнение, что для создания динамических сайтов на языке, отличном от php, необходимо убить уйму времени на написание соответствующего модуля для вебсервера, и извести метр нервов на сборку этого модуля с помощью кривого компилятора от фирмы "Майкрософт". Однако, это далеко не так - писать сайты можно на любом языке, для которого имеется консольный интерпретатор. Теоретически, можно написать сайт на Ассемблере, собрав полученную программу как консольное приложение. Законченные извращенцы могут попробовать сделать сайт на том мерзопакостном "языке программирования", что используется в командной строке Windows. Но сегодня мы не будем заниматься извращениями, и попробуем написать сайт на каком-нибудь более простом и понятном языке. А именно - на Lua.
Для этого нам понадобятся:
Итак, начнем. Для начала откроем файл конфигурации Apache, и убедимся, что для директории, в которой будут лежать наши скрипты, разрешено управление конфигом при помощи файлов .htaccess: Код AllowOverride All Далее откроем эту директорию, создадим в ней файл .htaccess, и пропишем в нем 2 заклинания: Код Options +ExecCGI Эта директива разрешает выполнение CGI-скриптов в данной директории.Код AddHandler cgi-script .lua Эта директива сообщает Апачу о том, что файлы с расширением .lua являются CGI-скриптами.Теперь создадим в этой же директории файл test.lua, и пропишем в первой строке путь к интерпретатору Lua (здесь и далее предполагается, что интерпретатор установлен в директорию C:\Program Files\lua): Код #!C:\Program Files\lua\lua.exe Далее попробуем вывести в окно браузера какую-нибудь строчку. Для тех кто не в курсе поясню - общение между Апачем и CGI-приложением происходит через стандартные потоки. Для передачи данных Апачу используется stdout, а для получения тела сообщения CGI-приложением - stdin. Итак, пишем скрипт: Код io.write("Hello world!!!") Пытаемся открыть наш скрипт в браузере, и... получаем ошибку 500 .Судорожно лезем в лог ошибок апача в надежде выяснить причину ошибки, и видим там следующее: Цитата [Sun Mar 15 02:35:07 2011] [error] [client 127.0.0.1] Premature end of script headers: test.lua Замечаем в сообщении знакомое слово "headers". Долго-долго думаем, что бы это могло означать... Нервничаем, кусаем бутерброд, запиваем его пивом... И тут нас осеняет: "Эврика, блеать, мы же не отправили заголовки!". Исправляем наш скрипт: Код io.write("content-type: text/html\n\nHello world!!!") Запускаем скрипт, и видим в окне браузера заветную строчку: Цитата Hello world!!! Ура!!! Оно работает!!! Бутерброды съедены не зря, и пиво выпито не напрасно. Продолжение следует... |
|
|
15.3.2011, 5:11
Сообщение
#2
|
|
Освоившийся участник Группа: Пользователи Сообщений: 276 Регистрация: 23.3.2010 Из: РФ Смоленск Пользователь №: 6 429 Спасибо сказали: 60 раз |
alex82,
Спасибо, по сути заменив путь до интерпретатора, можно тоже самое запустить и на линуксе. И еще наверное неплохобы отправить в заголовках кодировку, а то на русском будет несуразица.. P.S. Надо будет попробовать... |
|
|
15.3.2011, 10:39
Сообщение
#3
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Простые фразы можно так отсылать, а вот с построением сложных заголовков уже будет проблематично возиться, уж намного проще, когда это за тебя делает веб-сервер, а ты только заботишься о наполнении контекста.
Однако, как вариант данный метод сгодиться |
|
|
15.3.2011, 10:54
Сообщение
#4
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Setuper
Веб-сервер (во всяком случае Апач) не будет этим заниматься. От тупо отправит те заголовки, что передал ему скрипт, добавив в них заголовок с информацией о себе. При полном отсутствии заголовков он выкинет ошибку 500 и запишет "Premature end of script headers" в лог ошибок. Так что переложить всю работу на него не получится . Но можно автоматизировать этот процесс чтобы не возиться с составлением заголовков при написании каждой страницы. Как только решусь писать продолжение, напишу об этом. |
|
|
15.3.2011, 14:27
Сообщение
#5
|
|
Освоившийся участник Группа: Пользователи Сообщений: 276 Регистрация: 23.3.2010 Из: РФ Смоленск Пользователь №: 6 429 Спасибо сказали: 60 раз |
alex82,
просто можно также писать сайты на луа, по принципу подключения файлов как в php к примеру, то есть один файл index.lua запускается а уже через него все работает, к примеру index.lua?do=hublist , и всю рутинную работу делать непосредственно в index.lua. |
|
|
26.3.2011, 20:04
Сообщение
#6
|
|
Освоившийся участник Группа: Пользователи Сообщений: 248 Регистрация: 14.7.2008 Из: Хабаровск Пользователь №: 193 Спасибо сказали: 40 раз |
Вообщем делаю вот так.
захожу в папку apache\conf открываю файл httpd.conf в ней у меня стоит следующее: Код <Directory "s:/appserv/www"> Options Indexes FollowSymLinks MultiViews ExecCGI AllowOverride All Order allow,deny Allow from all </Directory> и Код AddHandler cgi-script .lua .cgi .pl Далее делаю дальше по инструкции. Цитата Далее откроем эту директорию, создадим в ней файл .htaccess, и пропишем в нем 2 заклинания: Код Options +ExecCGI Создаю в папке www файлик .htaccess пишу туда Options +ExecCGI и сохраняю. Далее... Создаю в той же папке www файлик test.lua Туда ввел пару строк: #!C:\Program Files\lua\lua.exe io.write("content-type: text/html\n\nHello world!!!") Ошибки: в apache\logs\error.log пишет ошибки Цитата [Sun Mar 27 03:55:08 2011] [error] [client 10.30.3.254] couldn't spawn child process: s:/appserv/www/test.lua [Sun Mar 27 03:55:09 2011] [error] [client 10.30.3.254] File does not exist: s:/appserv/www/favicon.ico а на браузере вот эта ошибка: Цитата Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log. Apache/1.3.29 Server at localhost Port 80 При изменении конфига, apache перезапускаю. И вот вопрос. Какие пальцы мне стоит выпрямить молотком, чтобы и молоток держать удобнее и чтобы все было нормуль. И де собственно мои корячки не так сделали? |
|
|
28.3.2011, 0:58
Сообщение
#7
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Цитата Apache/1.3.29 Server at localhost Port 80 Может дело не в руках вовсе? Бытует мнение что Apache 1 устарел.
|
|
|
28.3.2011, 1:27
Сообщение
#8
|
|
Site Reliability Engineer Группа: Модераторы Сообщений: 1 772 Регистрация: 27.6.2009 Из: Чувашия, г. Чебоксары Пользователь №: 3 719 Спасибо сказали: 479 раз |
в мире так 2.2.16, имхо
alex82, кстати, тема таки интересная, полезная. Стоит ждать продолжения?) |
|
|
16.5.2011, 1:12
Сообщение
#9
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 5 Регистрация: 3.4.2011 Пользователь №: 9 078 Спасибо сказали: 0 раз |
alex82, а расскажите пожалуйста, как работать с post запросами?
Т.е, обращаемся к вайлу index.lua, в форму post запроса вводим нужный IP, после чего нужно вызвать функцию, которая должна получить информацию об IP из mysql. Покажите пожалуйста пример реализации. Зарание спасибо. |
|
|
16.5.2011, 4:49
Сообщение
#10
|
|
Освоившийся участник Группа: Пользователи Сообщений: 276 Регистрация: 23.3.2010 Из: РФ Смоленск Пользователь №: 6 429 Спасибо сказали: 60 раз |
alex82, а расскажите пожалуйста, как работать с post запросами? Т.е, обращаемся к вайлу index.lua, в форму post запроса вводим нужный IP, после чего нужно вызвать функцию, которая должна получить информацию об IP из mysql. Покажите пожалуйста пример реализации. Зарание спасибо. А почитать маны по луа? |
|
|
16.5.2011, 7:59
Сообщение
#11
|
|
Наруто на аваторке Группа: Пользователи Сообщений: 2 606 Регистрация: 11.10.2008 Из: Харькова Пользователь №: 771 Спасибо сказали: 774 раза |
DEN 007
а нормально ответить человеку слабо или это модно теперь посылать в «маны» ? P.S. сам ответ знаешь или просто послал + отметился? |
|
|
16.5.2011, 9:20
Сообщение
#12
|
|
Освоившийся участник Группа: Пользователи Сообщений: 276 Регистрация: 23.3.2010 Из: РФ Смоленск Пользователь №: 6 429 Спасибо сказали: 60 раз |
|
|
|
16.5.2011, 22:33
Сообщение
#13
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Давно хотел продолжить эту тему, но все никак руки не доходили.
Итак, низкоуровневые функции: web.lua ( 6.21 килобайт ) Кол-во скачиваний: 60 Описание Таблицы: _SERVER - Окружение, полученное от web-сервера _HEADERS - Заголовки HTTP. По умолчанию в таблице содержится один заголовок: content-type: text/html. Все заголовки должны быть установлены до отправки каких-либо данных web-серверу. На момент первой отправки данных в таблице должен содержаться как минимум один заголовок, в противном случае web-сервер сообщит о внутренней ошибке. _GET - Переменные, полученные при помощи метода GET. _POST - Переменные, полученные при помощи метода POST. _REQUEST - Переменные, полученные при помощи методов GET и POST. _COOKIE - Куки, сохраненные на стороне клиента. _SET_COOKIE - Куки, которые необходимо сохранить на стороне клиента. Каждое значение должно быть таблицей, содержащей собственно значение куки и время истечения в формате unix-epoch. Если время истечения не указано, куки сохраняется до конца сессии. Для удаления куки, установите его заведомо просроченным. В таблицах _HEADERS,_GET,_POST,_REQUEST и _COOKIE все индексы хранятся в нижнем регистре. Таблицы _SERVER,_GET,_POST,_REQUEST и _COOKIE заполняются данными лишь при необходимости, поэтому к ним нельзя применять функции pairs и next. Функции: echo(...) - Функция, использующаяся для отправки данных клиенту. При первой отправке данных помимо самих данных отправляются заголовки, после чего добавление или изменение заголовков становится невозможным, а данная функция становится ссылкой на функцию io.write print(...) - Функция, использующаяся для отображения произвольных значений. Результат помещается в теги <pre><code></code></pre>. Данную функцию необходимо использовать только в целях отладки. tprint(tTable[, sTableName]) - Функция отображает содержимое таблицы tTable. Данную функцию необходимо использовать только в целях отладки. Переменные: _HEADERS_SENT - Переменная, определяющая, были ли отправлены заголовки. Менять значение этой переменной вручную не рекомендуется. Пример использования Код #!C:\Program Files\lua\lua.exe dofile("web.lua") if not _REQUEST.mode or _REQUEST.mode == "main" then echo("Hello world!!!") elseif _REQUEST.mode == "ip" then echo("Ваш IP: ",_SERVER.REMOTE_ADDR or "?") elseif _REQUEST.mode == "useragent" then echo("Ваш User-Agent: ",_SERVER.HTTP_USER_AGENT or "?") else echo("<center><h2>Кулхацкер, да?</h2><br>А ну-ка иди отседова по добру по здорову. Не то глазки красненькие повыковыриваю, да ручки шаловливые пообломаю.</center>") end |
|
|
15.6.2011, 10:48
Сообщение
#14
|
|
Site Reliability Engineer Группа: Модераторы Сообщений: 1 772 Регистрация: 27.6.2009 Из: Чувашия, г. Чебоксары Пользователь №: 3 719 Спасибо сказали: 479 раз |
Кстати
Хочу дополнить. Цитата Теперь создадим в этой же директории файл test.lua, и пропишем в первой строке путь к интерпретатору Lua (здесь и далее предполагается, что интерпретатор установлен в директорию C:\Program Files\lua): А тем, у кого lighttpd Код cgi.assign = ( ".lua" => "/usr/bin/lua5.1" ) |
|
|
15.6.2011, 23:45
Сообщение
#15
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Saymon21
Даже не буду ходить по ссылке. После ковыряния в коде некоторых библиотек от Kepler Project, у меня появились серьезные сомнения отностиельно вменяемости его авторов. |
|
|
19.6.2011, 2:39
Сообщение
#16
|
|
Site Reliability Engineer Группа: Модераторы Сообщений: 1 772 Регистрация: 27.6.2009 Из: Чувашия, г. Чебоксары Пользователь №: 3 719 Спасибо сказали: 479 раз |
Мда... Встаки прав alex82. Фигня :(
|
|
|
17.8.2011, 19:06
Сообщение
#17
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 8 Регистрация: 14.4.2011 Из: Барнаул Пользователь №: 9 140 Спасибо сказали: 5 раз |
А в виде специализированного web сервера, как node.js есть что–нибудь дельное?
|
|
|
17.8.2011, 19:20
Сообщение
#18
|
|
Местная ТехПоддержка Группа: Администраторы Сообщений: 1 875 Регистрация: 18.7.2008 Из: Моск. Обл, г. королев, район Болшево Пользователь №: 221 Спасибо сказали: 220 раз |
а зачем?? Ненужно это от луа.
|
|
|
Похожие темы
|
Сейчас: 23.12.2024, 4:29 |