Python Flask module and pythonflask Module
The module is a file containing response text, which contains the dynamic part represented by a space variable. The specific value is only known in the request context. Replace the variable with the actual value and return the final response string. This process is called rendering. To render the module, Flask uses a powerful template engine named Jinja2.
I. Jinja2 template engine
The simplest Jinja2 template is a file containing the response text.
1. Rendering Template
By default, Flask searches for templates in the templates subfolders in the program folder. .
#!/usr/bin/env pythonfrom flask import Flask,render_templateapp = Flask(__name__)@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()
The render_template function provided by Flask integrates the Jinja module engine into the program.
2. Variables
The {name} structure used in the template represents a variable. It is a special placeholder that tells the template engine to obtain the value of this position from the data used in the rendering template.
Jinja2 can recognize all types of variables, or even complex types, such as lists, dictionaries, and objects. Examples of variables used in the template are as follows:
<p>a value from a dictionary: {{ mydict['key'] }}</p><p>a value from a list:{{ mylist[3] }}</p><p>a value from a list,with a varliable index:{{ mylist[myintavr] }}</p><p>a value from a objects method:{{ myobj.somemethod() }}</p>
Jinja2 Variable Filter
Filter Name |
Description |
Safe |
, Do not escape during rendering |
Capitalize |
Converts an uppercase letter to a lowercase letter. |
Lower |
Converts a value to lowercase. |
Upper |
Converts a value to a large write format. |
Title |
Converts the initial letter of each word in the value to uppercase. |
Trim |
Remove the first space of the value |
Striptags |
Delete all HTML tags in the value before rendering |
3. Control Structure
Use the conditional control statement in the template:
{% if user %} Hello,{{ user }}!{% else %} Hello,Stranger!{% endif %}
<ul> {% for commet in commets %} <li>{{ commet }}</li> {% end for %}</ul>
Jinja2 also supports macros, similar to functions in Python code. For example:
{% macro render_commet(commet) %} <li>{{ commet }}</li>{% endmacro %}<ul> {% for commet in commets %} {{ render_commet(commet) }} {% endfor %}</ul>
To reuse macros, we can save them in a separate file and import them in the template to be used:
{% import 'macros.html' as macros %}<ul> {% for commet in commets %} {{ macros.render_commet(commet) }} {% endfor %}</ul>
Another powerful way to reuse code is template inheritance, which is similar to class inheritance in Python code. First, create a base template named base.html:
2. Integrate Twitter Bootstrp with Flask-Bootstrap
Bootstrap is a client architecture, so it does not directly involve servers. The server provides HTML responses that reference the Bootstrap Cascading Style Sheet (CSS) and Javascript files, and instantiate required components in HTML/CSS and Javascript code. The most ideal place for these operations is the template.
# Initialize Flask-bootstrapfrom flask. ext. bootstrap import Bootstrap #... bootstrap = Bootstrap (app)
After Flask-Bootstrap is initialized, a base template containing all Bootstrap files can be used in the program.
{% 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">
3. custom error page
# Custom error page #! /Usr/bin/env pythonfrom flask import Flask, render_templateapp = Flask (_ name _) @ 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 '), 500if _ name _ = '_ main _': app. run ()
4. Links
Flask provides the url_for () auxiliary function, which can generate a URL using the information saved in the program URL ing.
The simplest usage of url_for () is to use the view function name (or the endpoint name used when app. add_url_route () defines the route) as the parameter and return the corresponding URL.
When url_for () is used to generate a dynamic address, the dynamic part is passed in as a keyword parameter. For example, url_for ('user', name = 'john', _ external = True)
5. static files
By default, Flask searches for static files in the subdirectory named static in the root directory of the program. If necessary, you can use subfolders in the static folder to store files.
# Define the favorites icon {% 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 %}
6. Use Flask-Moment to localize the date and time
Flask-Moment is a Flask program extension that can integrate moment. js into the Jinja2 template.
# Initialize Flask-Momentfrom flask. ext. moment import Momentmoment = Moment (app)
# Introduce the moment. js library {% block scripts % }{{ super () }{{ moment. include_moment () }}{% endblock %}
#!/usr/bin/env pythonfrom flask import Flask,render_templateapp = Flask(__name__)from datetime import datetimefrom flask_moment import Momentmoment = Moment(app)@app.route('/')def index(): return render_template('index.html', current_time=datetime.utcnow())if __name__ == '__main__': app.run()