Web development with Lua
Programming Language
Introducing Sailor, a web MVC framework in Lua
Etiene Dalcol @etiene_d
Web development with
Lua Programming
Language
Introducing Sailor, a web MVC framework in Lua
Etiene Dalcol @etiene_d
Sailor!
Lua Ladies
http://lualadies.org
Google Summer of Code
LabLua
better reasons
•
It looks cool
better reasons
•
It looks cool
(I heard you could make games with it)
•
It’s made in my home country
better reasons
•
It looks cool
(I heard you could make games with it)
•
It’s made in my home country
(In my university to be more precise)
?
?
?
?
?
Lua on the web
•
Early stage
•
cgilua ~ 1995
“ I have myself developed Web sites with pure C++, Java, C#, PHP, and
Python. The easiest way to go was definitely Python. If the libraries existed, Lua would be not quite as easy to use as Python, but probably quite a bit more
efficient; I think it would become my first choice... if the libraries existed.” Michael Gogins
“ Recently there was some discussion about mod_lua on the Apache
developers mailing list. I mentioned there that I feel Lua could replace PHP as the number one web scripting language if mod_lua were stable (i.e. not still in beta) and it were implemented well (not making some of PHP's mistakes such as putting everything in the global scope with no consistent naming or
parameter schemes). I've wanted to use Lua for all the things I currently use PHP for ever since I discovered it.” Rena
Servers
•
Apache: mod_lua
Servers
•
Apache: mod_lua
Servers
•
Apache: mod_lua
•
Nginx: OpenResty
•
Xavante
Frameworks
• Orbit (2007)Least known
No significant updates since 2010 MVC
Frameworks
• Orbit (2007)Least known
No significant updates since 2010 MVC
• Luvit (2011)
Most popular
Intense development node.js port 2-4x faster
Frameworks
• Lapis (2012)Intense development Moonscript and Lua Very well documented Templater
OpenResty only Not MVC
Frameworks
• Lapis (2012)Intense development Moonscript and Lua Very well documented Templater
OpenResty only Not MVC
• Others
Complicated, abandoned, poorly documented, license issues or I never heard about it...
Sailor!
0.1 (Venus)
0.2 (Mars)
What exactly is Sailor?
• It’s an MVC web framework • Completely written in Lua
• Compatible with Apache (mod_lua), Nginx (OpenResty),
Mongoose, Xavante and Lwan
• Compatible with Linux, Windows and Mac • Compatible with different databases
• MIT License
• Pre alpha v0.2 (Mars)
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)
• 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
• Lua at client
What (else) is cool about
Sailor?
Not so great things
• It’s still in early development • Things are changing fast
• It lacks features • Documentation
How to get Sailor!
$ luarocks install sailor
$ sailor_create ‘My App’ /var/www
$ cd /var/www/my_app
How to get Sailor!
$ luarocks install sailor
$ sailor_create ‘My App’ /var/www
$ cd /var/www/my_app
$ lua start-server.lua
/conf
/controllers
/models
/pub
/runtime
/themes
/views
App structure
Example!
-- /controllers/site.lualocal site = {}
function site.index(page)
local msg = “Hello World”
page:render(‘index’, { msg = msg } )
end
function site.notindex(page)
page:write(“I’m different!”)
end
Example!
<!-- /views/site/index.lp -->
<p>
A message from the server:
<?
lua
page:print(msg) ?>
<br/>
The message again:
<%= msg %> <!-- same thing as above —>
</p>
Example!
<?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
js.window.alert(another_msg) ?>
Example!
local user = {}
local v = require “valua” -- validation module
user.attributes = { { id = “safe” }, { name = v:new().not_empty() } } user.db = { key = ‘id’, table = ‘users’ } user.relations = { posts = { -- u.posts
relation = “HAS_MANY”, model = “post”, attribute = “author_id”
} }
Example!
-- /controllers/site.lualocal 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