Julia unlike Python or Go Lang does not have a lot of packages for building web applications. In Python, there are several popular battle tested web frameworks for building web applications such as Django, Flask, FastAPI, Tornado, Bottle, CherryPy, Streamlit, etc. Golang also has several packages for web programming. However in Julia we have a few such as
- GenieFramework
- Mux.jl
- Merly.jl
- HTTP.jl
GenieFramework is the most popular and it has a similar approach like Django with an MVT or MVC approach. Genie great documentation. However in this tutorial we will be using Oxygen.jl – a web framework similar to Flask and easy to use.
Just as Genie.jl is to Django , in a way Oxygen.jl is to Flask
Getting Started with Oxygen.jl
In this post, we will build a simple application using Oxygen.jl and HTTP.jl. Since Oxygen.jl is still relatively new (circa 2023), it has not a lot of features yet, however we can still build some cool things with it and contribute to it.
First, let us create a virtual environment to work in and then install our necessary packages. Below is the packages and their purpose
- HTTP.jl : for working with HTTP request and response in Julia (similar to Request in Python)
- Oxygen.jl: as our web framework
- Mustache.jl: for our templating (similar to Jinja Templating in Python)
# Create our directory mkdir web_app cd web_app
Install Packages
# Activate virtualenv activate . add HTTP Oxygen Mustache
Next we will create a file app.jl where our backend code will be. Let us create a basic app with Oxygen.jl
using Oxygen using HTTP # creating route @get "/" function(req::HTTP.Request) return "Hello Julia Web App" end # Serialize dict to json @get "/home" function(req::HTTP.Request) return Dict("name" => "Jesse") end serve(port=8001)
We can now start our app using the code below, the –project will activate and use the packages in our virtual environment instead .
julia --project app.jl
You can check it out inside your browser to see the web app
Oxygen automatically generate a swagger UI on 127.0.0.1:80017docs for all the routes created, which can be useful when building REST APIs
We can also render html and work with other features such as
- Query Params
- Path Params
- Render HTML
- Serializing JSON
- etc
Below is the entire code
using Oxygen using HTTP using Mustache function render_html(html_file::String, context::Dict = Dict();status=200, headers=["Content-Type" => "text/html; charset=utf-8"]) :: HTTP.Response is_context_empty = isempty(context) === true # return raw hmtl without context if is_context_empty io = open(html_file,"r") do file read(file, String) end template = io |> String else # Render html with context io = open(html_file,"r") do file read(file, String) end template = String(Mustache.render(io, context)) end return HTTP.Response(status, headers,body = template) end # creating route @get "/" function(req::HTTP.Request) return "Hello Julia Web App" end # Serialize dict to json @get "/home" function(req::HTTP.Request) return Dict("name" => "Jesse") end # Render HTML # @get "/generate" function(req::HTTP.Request) # render_html("index.html") # end # Render HTML with context @get "/generate" function(req::HTTP.Request) context = Dict("name" => "Jesse") return render_html("index.html", context) end # Receiving query params # http://127.0.0.1:8001/query?books=bible @get "/query" function(req::HTTP.Request) return queryparams(req) end # Receiving form data @get "/generate/password" function(req::HTTP.Request) form_data = queryparams(req) fname = get(form_data,"fname","") context = Dict("fname" => fname) return render_html("generate.html", context) end # path params # http://127.0.0.1:8001/{num1}/{num2} @get "/add/{num1}/{num2}" function(req::HTTP.Request, num1::Float64, num2:: Float64) return num1 + num2 end # Routes : HOF for reuse api = router("/api", tags=["api endpoint"]) @get api("/add/{num1}/{num2}") function(req::HTTP.Request, num1::Float64, num2:: Float64) return num1 + num2 end @post api("/multiply/{num1}/{num2}") function(req::HTTP.Request, num1::Float64, num2:: Float64) return num1 * num2 end serve(port=8001)
You can also check this video tutorial for more
Thank You for your Attention
Jesus Saves
By Jesse E. Agbe(JCharis)