Web development with Lua Programming Language

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
@etiene_d
Sailor!
http://sailorproject.org
Lua Ladies
http://lualadies.org
Google Summer of Code
LabLua
Advantages
better reasons
•
It looks cool
(I heard you could make games with it)
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)
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)
It’s easy to learn
?
?
?
?
?
?
Lua on the web
•
Early stage
•
cgilua ~ 1995
•
Kepler Project ~ 2003
“ 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
Why?
Servers
•
Apache: mod_lua
•
Nginx: OpenResty
Servers
•
Apache: mod_lua
•
Nginx: OpenResty
Servers
•
Apache: mod_lua
•
Nginx: OpenResty
•
Xavante
•
Others
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!
Sailor!
Sailor!
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)
0.3 (Jupiter) will be released TODAY!
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
•
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
•
Lua at client
•
•
•
•
•
•
•
•
•
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
lua start-server.lua
How to get Sailor!
$
$
$
$
luarocks install sailor
sailor_create ‘My App’ /var/www
cd /var/www/my_app
lua start-server.lua
$ luarocks install luasql-mysql
App structure
/conf
/controllers
/models
/pub
/runtime
/themes
/views
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:write(“I’m different!”)
end
return site
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!
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!
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”
}
}
return user
Example!
-- /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
sailorproject.org
github.com/Etiene/sailor
[email protected]
@etiene_d
Example!
sailorproject.org
github.com/Etiene/sailor
[email protected]
@etiene_d