dcrck

dcrck

Possible to use Phoenix.View with non-compiled HTML templates?

Hi, I’m working on a project that requires generating and serving a (potentially large) number of static HTML files. Since the project also uses Phoenix, I’d like to take advantage of Phoenix’s ability to quickly render HTML templates with layouts, sanitizing contents, etc.

I know I could classify these HTML files as templates and use Phoenix.View, pattern: "**/*", root: "path/to/generated/html" to find all of them, then use render to serve them, but that requires compiling each generated file into a template, and I’m guessing (big assumption, please tell me if I’m wrong) that it recompiles all of them whenever a new file is added. I think this would become unwieldy with large numbers of files and frequent changes.

Alternatively, I could forego the view/template system entirely and use EEX.eval_file/1 to create the static files and just serve them with send_file, but that would be throwing out most/all of the benefits that Phoenix templating provides.

My question: is there a middle ground that allows me to use Phoenix’s HTML rendering/sanitizing/more goodies without necessarily compiling a large number of frequently-changing static HTML files into templates every time a new file is added/changed? I’ve looked at the source code for Phoenix.View and it’s not clear if this is possible.

To be fair, as noted above I only briefly explored the “make every file a template” option, so I could be wrong about how Phoenix decides what to compile when something changes.

Most Liked

l00ker

l00ker

A while back I needed to do something similar in a project I was working on so I hacked together a simple way to serve static HTML & Markdown out of a public directory at the root of the app. Nothing too fancy, but it gets the job done.

It could probably be improved but I haven’t really touched it much since I cooked it up. I haven’t tried to use it with really large pages, so YMMV.

I carved out the relevant code an pushed up a demo repo here:

In a release the settings in config.exs are plucked out of the environment by runtime.exs so that way I can use Application.put_env/3 to add additional directories for the static assets etc.

derek-zhou

derek-zhou

If you want to embed a html fragment inside your template as is, like a CMS, you can just read the file and raw/1 it. If you want to do some light templating and find the EEX too heavy/imposing for your liking, you can use bbmustache, which is just mustache so even non-Elixir people should feel comfortable with it.

l00ker

l00ker

I agree. This particular solution was hacked together in a short time to solve an immediate problem and has been in use on a few small low volume pages, most all of which use HTML and not Markdown. The Markdown option was added at the time to make it a little easier for a client that was unfamiliar with HTML to be able to upload some content.

At the time I intended to re-visit the issue and come up with a better solution but… time hasn’t yet been on my side! :slight_smile:

Where Next?

Popular in Questions Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Kurisu
For example for a current url like http://localhost:4000/cosmetic/products?_utf8=✓&query=perfume&page=2, I would like to get: ...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> somethi...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New

Other popular topics Top

sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

We're in Beta

About us Mission Statement