Lua - Lập trình Web
Lua là một ngôn ngữ rất linh hoạt và nó thường được sử dụng trên nhiều nền tảng bao gồm cả các ứng dụng web. Cộng đồng Kepler được thành lập vào năm 2004 để cung cấp các thành phần web mã nguồn mở trong Lua.
Mặc dù, có những web framework khác sử dụng Lua đã được phát triển, chúng tôi sẽ chủ yếu tập trung vào các thành phần do cộng đồng Kepler cung cấp.
Ứng dụng và Khung công tác
Orbit là một khung công tác web MVC cho Lua, dựa trên WSAPI.
WSAPI là API tóm tắt máy chủ lưu trữ web từ các ứng dụng web Lua và là cơ sở cho nhiều dự án.
Xavante là một máy chủ Web Lua cung cấp giao diện WSAPI.
Sputnik là một wiki / CMS được phát triển qua WSAPI trên Dự án Kepler được sử dụng để hài hước và giải trí.
CGILuacung cấp tính năng tạo trang web LuaPages và LuaScripts, dựa trên WSAPI nhưng không còn được hỗ trợ. Thay vào đó, hãy sử dụng Orbit, Sputnik hoặc WSAPI.
Trong hướng dẫn này, chúng tôi sẽ cố gắng làm cho bạn hiểu những gì Lua có thể làm và để biết thêm về cách cài đặt và sử dụng nó, hãy tham khảo trang web kepler
Quỹ đạo
Orbit là một khung công tác web MVC cho Lua. Nó hoàn toàn từ bỏ mô hình CGILua về "tập lệnh" để ủng hộ các ứng dụng, trong đó mỗi ứng dụng Orbit có thể nằm gọn trong một tệp duy nhất, nhưng bạn có thể chia nó thành nhiều tệp nếu muốn.
Tất cả các ứng dụng Orbit đều tuân theo giao thức WSAPI, vì vậy chúng hiện đang hoạt động với Xavante, CGI và Fastcgi. Nó bao gồm một trình khởi chạy giúp bạn dễ dàng khởi chạy phiên bản Xavante để phát triển.
Cách dễ nhất để cài đặt Orbit là sử dụng LuaRocks. Luarocks install quỹ đạo là lệnh cài đặt. Đối với điều này, bạn cần cài đặt LuaRocks trước.
Nếu bạn chưa cài đặt tất cả các phụ thuộc, đây là các bước cần thực hiện để thiết lập Orbit trong môi trường Unix / Linux.
Cài đặt Apache
Kết nối với máy chủ của bạn. Cài đặt Apache2, các mô-đun hỗ trợ của nó và kích hoạt các mô-đun Apache2 bắt buộc bằng cách sử dụng -
$ sudo apt-get install apache2 libapache2-mod-fcgid libfcgi-dev build-essential
$ sudo a2enmod rewrite
$ sudo a2enmod fcgid
$ sudo /etc/init.d/apache2 force-reload
Cài đặt LuaRocks
$ sudo apt-get install luarocks
Cài đặt WSAPI, FCGI, Orbit và Xavante
$ sudo luarocks install orbit
$ sudo luarocks install wsapi-xavante
$ sudo luarocks install wsapi-fcgi
Thiết lập Apache2
$ sudo raj /etc/apache2/sites-available/default
Thêm phần sau này bên dưới phần <Directory / var / www /> của tệp cấu hình. Nếu phần này có 'AllowOverride None' thì bạn cần thay đổi 'None' thành 'All' để tệp .htaccess có thể ghi đè cấu hình cục bộ.
<IfModule mod_fcgid.c>
AddHandler fcgid-script .lua
AddHandler fcgid-script .ws
AddHandler fcgid-script .op
FCGIWrapper "/usr/local/bin/wsapi.fcgi" .ws
FCGIWrapper "/usr/local/bin/wsapi.fcgi" .lua
FCGIWrapper "/usr/local/bin/op.fcgi" .op
#FCGIServer "/usr/local/bin/wsapi.fcgi" -idle-timeout 60 -processes 1
#IdleTimeout 60
#ProcessLifeTime 60
</IfModule>
Khởi động lại máy chủ để đảm bảo các thay đổi được thực hiện có hiệu lực.
Để kích hoạt ứng dụng của bạn, bạn cần thêm + ExecCGI vào tệp .htaccess trong thư mục gốc của ứng dụng Orbit - trong trường hợp này là / var / www.
Options +ExecCGI
DirectoryIndex index.ws
Ví dụ đơn giản - Quỹ đạo
#!/usr/bin/env index.lua
-- index.lua
require"orbit"
-- declaration
module("myorbit", package.seeall, orbit.new)
-- handler
function index(web)
return my_home_page()
end
-- dispatch
myorbit:dispatch_get(index, "/", "/index")
-- Sample page
function my_home_page()
return [[
<head></head>
<html>
<h2>First Page</h2>
</html>
]]
end
Bây giờ, bạn sẽ có thể khởi chạy trình duyệt web của mình. Truy cập http: // localhost: 8080 / và bạn sẽ thấy kết quả sau:
First Page
Orbit cung cấp một tùy chọn khác, tức là mã Lua có thể tạo ra html.
#!/usr/bin/env index.lua
-- index.lua
require"orbit"
function generate()
return html {
head{title "HTML Example"},
body{
h2{"Here we go again!"}
}
}
end
orbit.htmlify(generate)
print(generate())
Tạo biểu mẫu
Một ví dụ biểu mẫu đơn giản được hiển thị bên dưới:
#!/usr/bin/env index.lua
require"orbit"
function wrap (inner)
return html{ head(), body(inner) }
end
function test ()
return wrap(form (H'table' {
tr{td"First name",td( input{type = 'text', name='first'})},
tr{td"Second name",td(input{type = 'text', name='second'})},
tr{ td(input{type = 'submit', value = 'Submit!'}),
td(input{type = 'submit',value = 'Cancel'})
},
}))
end
orbit.htmlify(wrap,test)
print(test())
WSAPI
Như đã đề cập trước đó, WSAPI hoạt động như cơ sở cho nhiều dự án và có nhiều tính năng được nhúng trong đó. Bạn có thể sử dụng WSAPI và hỗ trợ các nền tảng sau,
- Windows
- Hệ thống dựa trên UNIX
Các máy chủ và giao diện được hỗ trợ bởi WSAPI bao gồm,
- CGI
- FastCGI
- Xavante
WSAPI cung cấp một số thư viện, giúp chúng tôi lập trình web dễ dàng hơn bằng Lua. Một số tính năng được hỗ trợ trong Lua bao gồm,
- Yêu cầu xử lý
- Bộ đệm đầu ra
- Authentication
- Tải lên tệp
- Yêu cầu cách ly
- Multiplexing
Dưới đây là một ví dụ đơn giản về WSAPI:
#!/usr/bin/env wsapi.cgi
module(..., package.seeall)
function run(wsapi_env)
local headers = { ["Content-type"] = "text/html" }
local function hello_text()
coroutine.yield("<html><body>")
coroutine.yield("<p>Hello Wsapi!</p>")
coroutine.yield("<p>PATH_INFO: " .. wsapi_env.PATH_INFO .. "</p>")
coroutine.yield("<p>SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "</p>")
coroutine.yield("</body></html>")
end
return 200, headers, coroutine.wrap(hello_text)
end
Bạn có thể thấy trong đoạn mã trên, một trang html đơn giản được hình thành và trả về. Bạn có thể thấy việc sử dụng các coroutines để có thể trả về câu lệnh theo câu lệnh cho hàm gọi. Cuối cùng, mã trạng thái html (200), tiêu đề và trang html được trả về.
Xavante
Xavante là một máy chủ Web Lua HTTP 1.1 sử dụng kiến trúc mô-đun dựa trên các trình xử lý được ánh xạ URI. Xavante hiện đang cung cấp,
- Trình xử lý tệp
- Trình xử lý chuyển hướng
- Trình xử lý WSAPI
Trình xử lý tệp được sử dụng cho các tệp chung. Trình xử lý chuyển hướng cho phép ánh xạ lại URI và trình xử lý WSAPI để xử lý với các ứng dụng WSAPI.
Một ví dụ đơn giản được hiển thị bên dưới.
require "xavante.filehandler"
require "xavante.cgiluahandler"
require "xavante.redirecthandler"
-- Define here where Xavante HTTP documents scripts are located
local webDir = XAVANTE_WEB
local simplerules = {
{ -- URI remapping example
match = "^[^%./]*/$",
with = xavante.redirecthandler,
params = {"index.lp"}
},
{ -- cgiluahandler example
match = {"%.lp$", "%.lp/.*$", "%.lua$", "%.lua/.*$" },
with = xavante.cgiluahandler.makeHandler (webDir)
},
{ -- filehandler example
match = ".",
with = xavante.filehandler,
params = {baseDir = webDir}
},
}
xavante.HTTP{
server = {host = "*", port = 8080},
defaultHost = {
rules = simplerules
},
}
Để sử dụng máy chủ ảo với Xavante, lệnh gọi đến xavante.HTTP sẽ được thay đổi thành một cái gì đó như sau:
xavante.HTTP{
server = {host = "*", port = 8080},
defaultHost = {},
virtualhosts = {
["www.sitename.com"] = simplerules
}
}
Các thành phần web Lua
Copas, một bộ điều phối dựa trên các quy trình có thể được sử dụng bởi các máy chủ TCP / IP.
Cosmo, một công cụ "mẫu an toàn" bảo vệ ứng dụng của bạn khỏi mã tùy ý trong các mẫu.
Coxpcall đóng gói Lua native pcall và xpcall với những cái tương thích với coroutine.
LuaFileSystem, một cách di động để truy cập cấu trúc thư mục cơ bản và các thuộc tính tệp.
Rings, một thư viện cung cấp cách tạo các trạng thái Lua mới từ bên trong Lua.
Ghi chú kết thúc
Có rất nhiều khung và thành phần web dựa trên Lua có sẵn cho chúng tôi và dựa trên nhu cầu, nó có thể được lựa chọn. Có sẵn các khuôn khổ web khác bao gồm những điều sau:
Moonstalkcho phép phát triển và lưu trữ hiệu quả các dự án dựa trên web được tạo động được xây dựng bằng ngôn ngữ Lua; từ các trang cơ bản đến các ứng dụng phức tạp.
Lapis, một khuôn khổ để xây dựng các ứng dụng web sử dụng MoonScript (hoặc Lua) chạy bên trong phiên bản tùy chỉnh của Nginx có tên là OpenResty.
Lua Server Pages, một trình cắm thêm của công cụ tạo kịch bản Lua giúp loại bỏ bất kỳ cách tiếp cận nào khác đối với phát triển web nhúng, mang đến một bước cắt ngắn ấn tượng cho các trang máy chủ C truyền thống.
Các khuôn khổ web này có thể thúc đẩy các ứng dụng web của bạn và giúp bạn thực hiện các hoạt động mạnh mẽ.