Flask framework (2) - JinJa2 template

    To separate business logic from presentation logic, Flask moved presentation logic to JinJa2 templates, which are files that contain response text. It uses placeholder variables to represent dynamic parts, which are known only from the request context.

Replacing the real value with the placeholder variable becomes the rendering. The creator of the JinJa2 template is also the creator of Flask, so there is no need to install additional packages.

1. Flask uses templates
1.1 Create a template

Create a templates directory in the same level directory of the program, and create user.html in this directory

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Hello {{ name }}!!!</h1>
</body>
</html>
{{ name }} is a variable character whose value needs to be rendered
1.2. Loading the template
from flask import Flask
from flask import render_template

app=Flask(__name__)

@app.route('/user/<name>')
def user(name):
    return render_template('user.html',name=name)

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

 

1.3 Variables and filters

JinJia2 can recognize all types of variables, such as:

{{ MyList[1] }}

{{ MyObj.test() }}

Jinja2 also provides filters for modifying variables

Usage: {{ name|uppr }}

 1.4 Control Structure

judge:

{% if user %}
	Hello,{{ user }}
{% else %}
    Please input your name!!!
 {% endif %}

cycle:

{% for name in user %}
  <li>{{ name }}</li>
{% endfor %}
1.5 Define macros 

Macros are similar to functions in Python and can be reused

macro.html

{% macro render_comment(comment) %}
 	<li>{{ comment }}</li>
{% endmacro %}

<ul>
	{% for comment in comments %}
		{{ render_comment(comment) }}
	{% endfor %}
</ul>	

 Import this macro file in the template

<body>
    {% import 'macro.html' as macros %}
    <ul>
    	{% for user in names  %}
			{{ macros.render_comment(user) }}
		{% endfor %}
	<ul>  
</body>
1.6 Inheritance

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
    <title>{% block title %}{% endblock %} - My APP</title>
    {% endblock %}
</head>

<body>
    {% block body %}
    {% endblock %}
</body>
</html>

 inherit base.html

{% extends "base.html" %}

{% block title %}Index{% endblock %}


{% block body %}
    <h1>hello world</h1>
{% endblock %}

 

2. Using Flask-BootStrap

 If you want to inherit bootstrap in your program, you can use the flask extension of flask-bootstrap to simplify the integration process.

2.1 Install Flask-BootStrap
pip install flask-bootstrap
2.2 Inherit bootstrap/base.html

user.html

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
    <div class="page-header">
        <h1>Hello, {{ name }}!</h1>
    </div>
</div>
{% endblock %}

  navbar and content represent the navigation bar and main content respectively

page effect:

 All blocks defined by bootstrap/base.html

3.3 Defining error pages

hello.py

from flask import Flask, render_template
from flask_bootstrap import Bootstrap

app = Flask(__name__)

bootstrap = Bootstrap(app)


@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404


@app.errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)

if __name__ == "__main__":
    app.run()

 write base.html

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
    {% block page_content %}{% endblock %}
</div>
{% endblock %}

  Write 404.html

{% extends "base.html" %}

{% block title %}Flasky - Page Not Found{% endblock %}

{% block page_content %}
<div class="page-header">
    <h1>Not Found</h1>
</div>
{% endblock %}
  3.4 Static files
{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
<link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
    {% block page_content %}{% endblock %}
</div>
{% endblock %}

  url_for will find the URL corresponding to the view function.

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324889103&siteId=291194637