Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Программирование на Lua _ Создание динамических страниц с помощью Lua

Автор: alex82 15.3.2011, 4:11

Бытует мнение, что для создания динамических сайтов на языке, отличном от 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 doubt.gif .

Судорожно лезем в лог ошибок апача в надежде выяснить причину ошибки, и видим там следующее:
Цитата
[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!!!

Ура!!! Оно работает!!! Бутерброды съедены не зря, и пиво выпито не напрасно.

Продолжение следует...

Автор: DEN 007 15.3.2011, 5:11

alex82,
Спасибо, по сути заменив путь до интерпретатора, можно тоже самое запустить и на линуксе.
И еще наверное неплохобы отправить в заголовках кодировку, а то на русском будет несуразица..

P.S. Надо будет попробовать...

Автор: Setuper 15.3.2011, 10:39

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


Однако, как вариант данный метод сгодиться big_smile.gif

Автор: alex82 15.3.2011, 10:54

Setuper

Веб-сервер (во всяком случае Апач) не будет этим заниматься. От тупо отправит те заголовки, что передал ему скрипт, добавив в них заголовок с информацией о себе. При полном отсутствии заголовков он выкинет ошибку 500 и запишет "Premature end of script headers" в лог ошибок. Так что переложить всю работу на него не получится big_smile.gif.

Но можно автоматизировать этот процесс чтобы не возиться с составлением заголовков при написании каждой страницы. Как только решусь писать продолжение, напишу об этом.

Автор: DEN 007 15.3.2011, 14:27

alex82,
просто можно также писать сайты на луа, по принципу подключения файлов как в php к примеру, то есть один файл index.lua запускается а уже через него все работает, к примеру index.lua?do=hublist , и всю рутинную работу делать непосредственно в index.lua.

Автор: Invisible 26.3.2011, 20:04

Вообщем делаю вот так.

захожу в папку 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 перезапускаю.
И вот вопрос. Какие пальцы мне стоит выпрямить молотком, чтобы и молоток держать удобнее и чтобы все было нормуль. И де собственно мои корячки не так сделали? beat_plaster.gif

Автор: alex82 28.3.2011, 0:58

Цитата
Apache/1.3.29 Server at localhost Port 80
Может дело не в руках вовсе? Бытует мнение что Apache 1 устарел.

Автор: Saymon21 28.3.2011, 1:27

в мире так 2.2.16, имхо

alex82, кстати, тема таки интересная, полезная. Стоит ждать продолжения?big_smile.gif)

Автор: AltSide 16.5.2011, 1:12

alex82, а расскажите пожалуйста, как работать с post запросами?
Т.е, обращаемся к вайлу index.lua, в форму post запроса вводим нужный IP, после чего нужно вызвать функцию, которая должна получить информацию об IP из mysql.

Покажите пожалуйста пример реализации.
Зарание спасибо.

Автор: DEN 007 16.5.2011, 4:49

Цитата(AltSide @ 16.5.2011, 2:12) *
alex82, а расскажите пожалуйста, как работать с post запросами?
Т.е, обращаемся к вайлу index.lua, в форму post запроса вводим нужный IP, после чего нужно вызвать функцию, которая должна получить информацию об IP из mysql.

Покажите пожалуйста пример реализации.
Зарание спасибо.

А почитать маны по луа?

Автор: Артём 16.5.2011, 7:59

DEN 007
а нормально ответить человеку слабо или это модно теперь посылать в «маны» ?
P.S. сам ответ знаешь или просто послал + отметился?

Автор: DEN 007 16.5.2011, 9:20

Цитата(Артём @ 16.5.2011, 8:59) *
DEN 007
а нормально ответить человеку слабо или это модно теперь посылать в «маны» ?
P.S. сам ответ знаешь или просто послал + отметился?

а я знаю что это можно найти в манах которые самолично читал на тему получения http запросов.

Автор: alex82 16.5.2011, 22:33

Давно хотел продолжить эту тему, но все никак руки не доходили.

Итак, низкоуровневые функции:
 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


Автор: Saymon21 15.6.2011, 10:48

Кстати http://mydc.ru/r/?http://keplerproject.github.com/cgilua/index.html

Хочу дополнить.

Цитата
Теперь создадим в этой же директории файл test.lua, и пропишем в первой строке путь к интерпретатору Lua (здесь и далее предполагается, что интерпретатор установлен в директорию C:\Program Files\lua):

А тем, у кого lighttpd
Код
cgi.assign = (
".lua" => "/usr/bin/lua5.1"
)


Автор: alex82 15.6.2011, 23:45

Saymon21

Даже не буду ходить по ссылке. bad_smile.gif

После ковыряния в коде некоторых библиотек от Kepler Project, у меня появились серьезные сомнения отностиельно вменяемости его авторов.

Автор: Saymon21 19.6.2011, 2:39

Мда... Встаки прав alex82. Фигня :(

Автор: OCTAGRAM 17.8.2011, 19:06

А в виде специализированного web сервера, как node.js есть что–нибудь дельное?

Автор: mariner 17.8.2011, 19:20

а зачем?? Ненужно это от луа.