Flask (web framework)
Python web framework
- 4 min read
- 4 chapters
Related on Lably
Through Python (programming language), Database and Sandbox (computer security)
Applications that use the Flask framework include Pinterest and LinkedIn.
History
Flask was created by Armin Ronacher of Pocoo, an international group of Python enthusiasts formed in 2004. According to Ronacher, the idea was originally an April Fool's joke that was popular enough to make into a serious application. The name is a play on the earlier Bottle framework.
When Ronacher and Georg Brandl created a bulletin board system written in Python in 2004, the Pocoo projects Werkzeug and Jinja were developed.
In April 2016, the Pocoo team was disbanded and development of Flask and related libraries passed to the newly formed Pallets project.
Flask has become popular among Python enthusiasts. As of October 2020, it has the second-most number of stars on GitHub among Python web-development frameworks, only slightly behind Django, and was voted the most popular web framework in the Python Developers Survey for years between and including 2018 and 2022.
Sign in to keep reading
3 more chapters are free with a Lably account.
Components
The microframework Flask is part of the Pallets Projects (formerly Pocoo), and based on several others of them, all under a BSD license.
Werkzeug
Werkzeug (German for "tool") is a utility library for the Python programming language for Web Server Gateway Interface (WSGI) applications. Werkzeug can instantiate objects for request, response, and utility functions. It can be used as the basis for a custom software framework and supports Python 2.7 and 3.5 and later.
Jinja
Jinja, also by Ronacher, is a template engine for the Python programming language. Similar to the Django web framework, it handles templates in a sandbox.
MarkupSafe
MarkupSafe is a string handling library for the Python programming language. The eponymous MarkupSafe type extends the Python string type and marks its contents as "safe"; combining MarkupSafe with regular strings automatically escapes the unmarked strings, while avoiding double escaping of already marked strings.
ItsDangerous
ItsDangerous is a safe data serialization library for the Python programming language. It is used to store the session of a Flask application in a cookie without allowing users to tamper with the session contents.
Click
Click is a Python package used by Flask to create command-line interfaces (CLI) by providing a simple and composable way to define commands, arguments, and options.
Features
- Development server and debugger
- Integrated support for unit testing
- RESTful request dispatching
- Uses Jinja templating
- Support for secure cookies (client side sessions)
- 100% WSGI 1.0 compliant
- Unicode-based
- Complete documentation
- Google App Engine compatibility
- Extensions available to extend functionality
Example
The following code shows a simple web application that displays "Hello World!" when visited:
<span id="mwng"></span><span class="kn" id="mwnw">from</span><span class="w" id="mwoA"> </span><span class="nn" id="mwoQ">flask</span><span class="w" id="mwog"> </span><span class="kn" id="mwow">import</span> <span class="n" id="mwpA">Flask</span> <span class="n" id="mwpQ">app</span> <span class="o" id="mwpg">=</span> <span class="n" id="mwpw">Flask</span><span class="p" id="mwqA">(</span><span class="vm" id="mwqQ">__name__</span><span class="p" id="mwqg">)</span> <span class="nd" id="mwqw">@app</span><span class="o" id="mwrA">.</span><span class="n" id="mwrQ">route</span><span class="p" id="mwrg">(</span><span class="s2" id="mwrw">"/"</span><span class="p" id="mwsA">)</span> <span class="k" id="mwsQ">def</span><span class="w" id="mwsg"> </span><span class="nf" id="mwsw">hello</span><span class="p" id="mwtA">()</span> <span class="o" id="mwtQ">-></span> <span class="nb" id="mwtg">str</span><span class="p" id="mwtw">:</span> <span class="k" id="mwuA">return</span> <span class="s2" id="mwuQ">"Hello World"</span> <span class="k" id="mwug">if</span> <span class="vm" id="mwuw">__name__</span> <span class="o" id="mwvA">==</span> <span class="s2" id="mwvQ">"__main__"</span><span class="p" id="mwvg">:</span> <span class="n" id="mwvw">app</span><span class="o" id="mwwA">.</span><span class="n" id="mwwQ">run</span><span class="p" id="mwwg">()</span>
Render Template with Flask
<span id="mwxg"></span><span class="kn" id="mwxw">from</span><span class="w" id="mwyA"> </span><span class="nn" id="mwyQ">flask</span><span class="w" id="mwyg"> </span><span class="kn" id="mwyw">import</span> <span class="n" id="mwzA">Flask</span><span class="p" id="mwzQ">,</span> <span class="n" id="mwzg">render_template</span> <span class="n" id="mwzw">app</span> <span class="o" id="mw0A">=</span> <span class="n" id="mw0Q">Flask</span><span class="p" id="mw0g">(</span><span class="vm" id="mw0w">__name__</span><span class="p" id="mw1A">)</span> <span class="nd" id="mw1Q">@app</span><span class="o" id="mw1g">.</span><span class="n" id="mw1w">route</span><span class="p" id="mw2A">(</span><span class="s2" id="mw2Q">"/"</span><span class="p" id="mw2g">)</span> <span class="k" id="mw2w">def</span><span class="w" id="mw3A"> </span><span class="nf" id="mw3Q">message</span><span class="p" id="mw3g">():</span> <span class="n" id="mw3w">message</span> <span class="o" id="mw4A">=</span> <span class="s2" id="mw4Q">"Hello World!"</span> <span class="k" id="mw4g">return</span> <span class="n" id="mw4w">render_template</span><span class="p" id="mw5A">(</span><span class="s2" id="mw5Q">"index.html"</span><span class="p" id="mw5g">,</span><span class="n" id="mw5w">message</span><span class="o" id="mw6A">=</span><span class="n" id="mw6Q">message</span><span class="p" id="mw6g">)</span>
Jinja in HTML for the Render Template
<span id="mw7g"></span><span class="cp" id="mw7w"><!DOCTYPE html></span> <span class="p" id="mw8A"><</span><span class="nt" id="mw8Q">html</span> <span class="na" id="mw8g">lang</span><span class="o" id="mw8w">=</span><span class="s" id="mw9A">"en"</span><span class="p" id="mw9Q">></span> <span class="p" id="mw9g"><</span><span class="nt" id="mw9w">head</span><span class="p" id="mw-A">></span> <span class="p" id="mw-Q"><</span><span class="nt" id="mw-g">meta</span> <span class="na" id="mw-w">charset</span><span class="o" id="mw_A">=</span><span class="s" id="mw_Q">"UTF-8"</span><span class="p" id="mw_g">></span> <span class="p" id="mw_w"><</span><span class="nt" id="mwAQA">title</span><span class="p" id="mwAQE">></span>{{ message }}<span class="p" id="mwAQI"></</span><span class="nt" id="mwAQM">title</span><span class="p" id="mwAQQ">></span> <span class="p" id="mwAQU"></</span><span class="nt" id="mwAQY">head</span><span class="p" id="mwAQc">></span> <span class="p" id="mwAQg"><</span><span class="nt" id="mwAQk">body</span><span class="p" id="mwAQo">></span> <span class="p" id="mwAQs"><</span><span class="nt" id="mwAQw">p</span><span class="p" id="mwAQ0">></span>{{ message }}<span class="p" id="mwAQ4"></</span><span class="nt" id="mwAQ8">p</span><span class="p" id="mwARA">></span> <span class="p" id="mwARE"></</span><span class="nt" id="mwARI">body</span><span class="p" id="mwARM">></span> <span class="p" id="mwARQ"></</span><span class="nt" id="mwARU">html</span><span class="p" id="mwARY">></span>
