'is it possible to have a flask app and an ejs website

i am making a flask app and usually i would do the following code:

from flask import (
    Flask, 
    render_template, 
    request
)

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # print(request.form.get('hallo'))
        pass
    return render_template('index.html')


if __name__ == '__main__':
    app.run(debug=True)

but i now need to do the same thing with EJS, is this possible and could i just do:

from flask import (
    Flask, 
    render_template, 
    request
)

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # print(request.form.get('hallo'))
        pass
    return render_template('home.ejs')


if __name__ == '__main__':
    app.run(debug=True)

because that doesnt work for me. IF i can't use flask and ejs please do let me know what would work with ejs.

Thanks



Solution 1:[1]

render_template reads file directly from disk.

You would have to run it as subprocess and get result from this process, and later use it with render_template_string (instead of render_template) or directly with return

import subprocess

process = subprocess.run('ejs home.ejs', shell=True, capture_output=True)

html  = process.stdout.decode()
error = process.stderr.decode()

print(html)
print(error)

And similar in Flask

import subprocess

from flask import (
    Flask, 
    render_template, 
    render_template_string, 
    request
)

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():

    # ...code ...
    
    process = subprocess.run('ejs home.ejs', shell=True, capture_output=True)

    html  = process.stdout.decode()
    #error = process.stderr.decode()

    return html

    # or
    
    return render_template_string(html)

if __name__ == '__main__':
    app.run(debug=True)

EDIT:

To make it more useful you can put code in separated function and use full path to ejs and to folder with templates

# --- constants ---

EJS_EXE = '/full/path/to/ejs.exe'
EJS_TEMPLATES = '/full/path/to/folder/with/templates'

# --- code ---

def render_ejs(filename, params="", folder=EJS_TEMPLATES, debug=False):

    path = os.path.join(folder, filename)
    
    # to make sure I put `ejs` and `path` in `' '` because they may have spaces in full path
    process = subprocess.run(f"'{EJS_EXE}' '{path}' {params}", 
                             shell=True, capture_output=True)

    html  = process.stdout.decode()

    if debug:
        error = process.stderr.decode()
        print(error)

    return html


@app.route('/', methods=['GET', 'POST'])
def index():

    # ...code ...
    
    html = render_ejs('home.ejs')
    # or
    html = render_ejs('home.ejs', "some params")
    # or
    html = render_ejs('home.ejs', "some params", "other/folder")
    # or
    html = render_ejs('home.ejs', folder="other/folder")

    return html
    # or
    return render_template_string(html)

If you use render_ejs(..., debug=True) then in console it will display error from EJS.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1