Веб сервер на Lua. Часть 2: Структура
Веб сервер на Lua.
Часть 2: Структура
Здравствуйте. Вы читаете запись из цикла "Веб сервер на Lua". В конце данного цикла у нас получится вполне работоспособный веб сайт, причем быстрый, да еще и на Lua. Я все действия буду производить в такой среде как "c9", сайт будет доступен под адресом: http://lua-includeralex.c9.io/ Все файлы, вы можете посмотреть тут: http://ide.c9.io/includeralex/lua Что, ж поехали.
В этой части мы создадим структуру нашего сайта, а также узнаем о некоторых фишках Lapis.
Структура
Начнем, пожалуй с со структуры нашего веб-приложения.
.├── app.lua // Входная точка приложения├── client_body_temp // папка с tmp файлами├── fastcgi_temp // папка с tmp файлами├── logs // папка с логами nginx'а│ ├── access.log // думаю, все знакомы с логами nginx│ ├── error.log│ └── nginx.pid├── mime.types // файл с mime типами├── nginx.conf // конфигурационный файл nginx├── nginx.conf.compiled├── proxy_temp // папка с tmp файлами├── public // папка с публичными файлами│ ├── script.js│ └── style.css├── scgi_temp // папка с tmp файлами├── uwsgi_temp // папка с tmp файлами└── views // папка с нашими вьюшками ├── index.etlua └── layout.etlua // шаблон для всех страниц
В файле app.lua находится весь код нашего приложения.
В файле nginx.conf находятся настройки NGINX
В папке public находятся все публичные файлы, например:
Файл: public/style.cssURL к файлу: хост.домен/style.css
В папке views находятся наши "вьюшки", они используются при рендере наших страниц, в этой папке должны находится только те файлы, расширение которых == .etlua. О etlua мы поговорим чуть позже.
Код
Как вообще будет работать наше приложение? Да, очень просто.
Всю логику мы будем описывать в файле app.lua.
Посмотрим на код простейшего приложения на Lapis:
local lapis = require("lapis")local app = lapis.Application()app:get("/", function(self) return "Контент страницы"end)return app
Сначала мы подключаем сам lapis, далее мы создаем приложение lapis, используя метод Application. Потом создаем роутер на путь "/" который возвращает нам контент страницы. В конце концов мы возвращаем наше приложение.
Все довольно просто. Используя полученные знания мы можем написать другой код:
local lapis = require("lapis")local app = lapis.Application()function init() -- функция инициализации app:enable("etlua") app.layout = require "views.layout"endfunction getFile(path) return io.open(path,"r"):read("*all")endfunction index(self) -- функция получения index self.page_title = "To-Do App" return {render = "index"}end-- роутеры страницapp:get("/", index)-- 404 ошибкаapp.handle_404 = function(self) page = io.open("public"..self.req.parsed_url.path,"r") if page then return {layout = false, page:read("*all")} else return "Not found!" endendinit()return app
Тут мы можем узреть вещи, неизвестные нам. А именно:
- app.handle_404
- render = "index"
- app:enable("etlua")
- app.layout = require "views.layout"
app.handle_404 - функция которая вызывается при ошибке "404", мы ее переопределяем на свою функцию. Наша функция - выполняет очень дельные вещи.
app.handle_404 вызывается если роутер для страницы не найден. В нашем случае мы проверяем, есть ли файл по пути public..<url_не_найденного_роутера>, если он есть - мы выводим его контент, параметр layout = false делает так, чтоб мы возвращали не контент сайта, а полный код сайта. Если такого файла нет - мы пишем сообщение об ошибке "404 не найдено".
render = "index" - рендерит файл (с расширением .etlua), который находится в папке views, о которой мы уже говорили.
app:enable("etlua") - включает шаблонизатор EtLua, если мы это не напишем - то потеряем огромный функционал Lapis.
app.layout = require "views.layout" - устанавливает стандартный шаблон для сайта, по пути /views/layout.etlua
Итак, разобрались с кодом, перейдем к шаблонизатору.
Шаблонизатор: EtLua
Шаблонизатор EtLua очень похож на PHP. Рассмотрим пример кода:
-- views/layout.etlua<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title><%= page_title or "Page from Lua" %></title> <%= page_headers or "" %></head><body> <% content_for("inner") %></body></html>
То что находится в <% %> - луа код. Мы можем выполнять lua прямо тут.
То что находится в <%= %> - возвращает то что нам отдал луа код - в html. Например:
<title><%= "Page from Lua" %></title>Эквивалентно:<title>Page from Lua</title>
На этом все.
Enjoy!
- 3
4 комментария
Рекомендуемые комментарии