Web development
in Lua
Introducing Sailor, an MVC
web framework

Etiene Dalcol
@etiene_d
@etiene_dFOSDEM 2016
@etiene_d
@etiene_dFOSDEM 2016
Sailor!

sailorproject.org
@etiene_dFOSDEM 2016
Google Summer of Code
LabLua
@etiene_dFOSDEM 2016
Lua Ladies

lualadies.org
@etiene_dFOSDEM 2016
Lua Space

lua.space
@etiene_dFOSDEM 2016
Web dev in Lua
Sailor
The future
@etiene_dFOSDEM 2016
Web dev in Lua
Sailor
The future
@etiene_dFOSDEM 2016
@etiene_dFOSDEM 2016
http://www.humbedooh.com/presentations/ACNA%20-%20mod_lua.odp Introducing mod_lua by Daniel Gruno
@etiene_dFOSDEM 2016
Servers
• Apache: mod_lua
• Nginx: OpenResty
@etiene_dFOSDEM 2016
Servers
• Apache: mod_lua
• Nginx: OpenResty







@etiene_dFOSDEM 2016
Servers
• Apache: mod_lua
• Nginx: OpenResty
• Xavante
• Others: Lighttpd, Lwan, Pegasus, Mongoose
@etiene_dFOSDEM 2016
Frameworks
Micro-frameworks
Lapis
MVC
Orbit

Event-driven
Luvit
TurboLua
Others
Ophal, Sputnik, LuaPress, Tir, Vanilla
http://lua.space/webdev/the-best-lua-web-frameworks
@etiene_dFOSDEM 2016
Web dev in Lua
Sailor
The future
@etiene_dFOSDEM 2016
What exactly is
Sailor?
• It’s an MVC web framework
• Completely written in Lua
• Compatible with Apache (mod_lua), Nginx (OpenResty),
Xavante, Mongoose, Lighttpd and Lwan
• Compatible with Linux, Windows and Mac
• Compatible with different databases
• MIT License
• v0.5 (Pluto)
• Planning next release to be a 1.0!
@etiene_dFOSDEM 2016
@etiene_dFOSDEM 2016
What (else) is cool about
Sailor?
• Routing and friendly URLs
• Session, cookies, include, redirect…
• Lua Pages parsing
• Mail sending
• Simple Object Relational-Mapping
• Validation (valua)
• Basic login and authentication modules
• Form generation
• Themes (Bootstrap integration out of the box)
• App generator (Linux and Mac only)
• Model and CRUD generator
• Automated tests
@etiene_dFOSDEM 2016
• Routing and friendly URLs
• Session, cookies, include, redirect…
• Lua Pages parsing
• Mail sending
• Simple Object Relational-Mapping
• Validation (valua)
• Basic login and authentication modules
• Form generation
• Themes (Bootstrap integration out of the box)
• App generator (Linux and Mac only)
• Model and CRUD generator
• Automated tests
• Lua at client
What (else) is cool about
Sailor?
@etiene_dFOSDEM 2016
Not so great things
• It’s still in early development
• Things are changing fast
• It lacks features
• Documentation
@etiene_dFOSDEM 2016
How to get Sailor!
$ luarocks install sailor

$ sailor create ‘My App’ /var/www

$ cd /var/www/my_app

$ lua start-server.lua
@etiene_dFOSDEM 2016
@etiene_dFOSDEM 2016
/conf
/controllers
/models
/pub
/runtime
/tests
/themes
/views
App structure
@etiene_dFOSDEM 2016
Example!
-- /controllers/site.lua

local site = {}



function site.index(page)

local msg = “Hello World”

page:render(‘index’, { msg = msg } )

end

function site.notindex(page)

page.theme = nil

page:write(“I’m different!”)

end



return site
@etiene_dFOSDEM 2016
<!-- /views/site/index.lp —>





<p> 

A message from the server:

<?lua page:print(msg) ?>

<br/>

The message again:

<%= msg %> <!-- syntactic sugar: same thing as above —>

</p>

Example!
@etiene_dFOSDEM 2016
@etiene_dFOSDEM 2016
<?lua@server -- Code here runs on the server ?>

<?lua -- Same as above ?>

<?lua@client -- Runs at the client ?>

<?lua@both -- Runs at the server and the client ?>



<?lua@both

another_msg = “Another message”

?>

<?lua page:print(another_msg) ?>

<?lua@client

window:alert(another_msg) 

?>
Example!
@etiene_dFOSDEM 2016
@etiene_dFOSDEM 2016
local user = {}

local v = require “valua” -- validation module



user.attributes = {

{ id = “safe” },

{ name = v:new().not_empty().len(6,50) }

}

user.db = {

key = ‘id’,

table = ‘users’

}

user.relations = {

posts = { -- u.posts

relation = “HAS_MANY”, model = “post”, attribute = “author_id”

}

}

return user
Example!
@etiene_dFOSDEM 2016
local user = {}

local v = require “valua” -- validation module



user.attributes = {

{ id = “safe” },

{ name = v:new().not_empty().len(6,50) }

}

user.db = {

key = ‘id’,

table = ‘users’

}

user.relations = {

posts = { -- u.posts

relation = “HAS_MANY”, model = “post”, attribute = “author_id”

}

}

return user
Example!
@etiene_dFOSDEM 2016
-- /controllers/site.lua
local site = {}

function site.index(page)
local User = sailor.model(‘user’)
local u = User:new()
u.name = ‘Arnold’
local msg
if u:save() then
msg = ‘Success’
else
msg = table.unpack(u.errors)
end
local users = User:find_all()
page:render(‘index’, { msg = msg, users = users } )
end 

return site
Example!
@etiene_dFOSDEM 2016
Web dev in Lua
Sailor
The future
@etiene_dFOSDEM 2016
Rails Girls
Summer of Code
@etiene_dFOSDEM 2016
bit.ly/luawebdev
sailorproject.org
github.com/sailorproject
dalcol@etiene.net
@etiene_d
sailorproject.org
github.com/sailorproject
dalcol@etiene.net
@etiene_d
gitter.im/sailorproject/sailor
sailorproject.org
github.com/sailorproject
dalcol@etiene.net
@etiene_d
Thank you!
sailorproject.org
github.com/sailorproject
dalcol@etiene.net
@etiene_d

Web development in Lua @ FOSDEM 2016