Introduction
Flask is a micro web framework for Python, designed to be lightweight and modular while still offering the flexibility needed to build robust web applications. It is widely used for its simplicity, scalability, and extensive community support. This guide will take you from the very basics of Flask to advanced features, ensuring a solid understanding of the framework.
1. What is Flask?
Flask is a web framework for Python that provides tools, libraries, and technologies for building web applications. Unlike Django, which is a full-fledged web framework with built-in features, Flask follows a minimalistic approach, allowing developers to choose their tools as needed.
Features of Flask:
- Lightweight & Simple: Does not come with built-in ORM, authentication, or admin panel.
- Modular: Allows integration of extensions as per project needs.
- Flexible: Supports RESTful API development.
- Jinja2 Templating: Provides powerful templating for rendering dynamic HTML pages.
- WSGI-based: Uses Werkzeug, a WSGI toolkit for request handling.
2. Setting Up Flask
Installation
To get started, install Flask using pip:
pip <span>install </span>flaskpip <span>install </span>flaskpip install flask
Enter fullscreen mode Exit fullscreen mode
Creating a Simple Flask Application
Create a Python file, e.g., app.py
, and write the following code:
<span>from</span> <span>flask</span> <span>import</span> <span>Flask</span><span>app</span> <span>=</span> <span>Flask</span><span>(</span><span>__name__</span><span>)</span><span>@app.route</span><span>(</span><span>'</span><span>/</span><span>'</span><span>)</span><span>def</span> <span>home</span><span>():</span><span>return</span> <span>"</span><span>Hello, Flask!</span><span>"</span><span>if</span> <span>__name__</span> <span>==</span> <span>'</span><span>__main__</span><span>'</span><span>:</span><span>app</span><span>.</span><span>run</span><span>(</span><span>debug</span><span>=</span><span>True</span><span>)</span><span>from</span> <span>flask</span> <span>import</span> <span>Flask</span> <span>app</span> <span>=</span> <span>Flask</span><span>(</span><span>__name__</span><span>)</span> <span>@app.route</span><span>(</span><span>'</span><span>/</span><span>'</span><span>)</span> <span>def</span> <span>home</span><span>():</span> <span>return</span> <span>"</span><span>Hello, Flask!</span><span>"</span> <span>if</span> <span>__name__</span> <span>==</span> <span>'</span><span>__main__</span><span>'</span><span>:</span> <span>app</span><span>.</span><span>run</span><span>(</span><span>debug</span><span>=</span><span>True</span><span>)</span>from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, Flask!" if __name__ == '__main__': app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode
Running the Flask App
python app.pypython app.pypython app.py
Enter fullscreen mode Exit fullscreen mode
Navigate to http://127.0.0.1:5000/
in your browser to see the output.
3. Routing in Flask
Flask provides routing functionality to map URLs to functions.
<span>@app.route</span><span>(</span><span>'</span><span>/about</span><span>'</span><span>)</span><span>def</span> <span>about</span><span>():</span><span>return</span> <span>"</span><span>This is the about page.</span><span>"</span><span>@app.route</span><span>(</span><span>'</span><span>/about</span><span>'</span><span>)</span> <span>def</span> <span>about</span><span>():</span> <span>return</span> <span>"</span><span>This is the about page.</span><span>"</span>@app.route('/about') def about(): return "This is the about page."
Enter fullscreen mode Exit fullscreen mode
Dynamic Routing
<span>@app.route</span><span>(</span><span>'</span><span>/user/<string:name></span><span>'</span><span>)</span><span>def</span> <span>greet</span><span>(</span><span>name</span><span>):</span><span>return</span> <span>f</span><span>"</span><span>Hello, </span><span>{</span><span>name</span><span>}</span><span>!</span><span>"</span><span>@app.route</span><span>(</span><span>'</span><span>/user/<string:name></span><span>'</span><span>)</span> <span>def</span> <span>greet</span><span>(</span><span>name</span><span>):</span> <span>return</span> <span>f</span><span>"</span><span>Hello, </span><span>{</span><span>name</span><span>}</span><span>!</span><span>"</span>@app.route('/user/<string:name>') def greet(name): return f"Hello, {name}!"
Enter fullscreen mode Exit fullscreen mode
URL Converters in Flask
Flask allows type-specific URL converters:
<span>@app.route</span><span>(</span><span>'</span><span>/post/<int:post_id></span><span>'</span><span>)</span><span>def</span> <span>show_post</span><span>(</span><span>post_id</span><span>):</span><span>return</span> <span>f</span><span>"</span><span>Post ID: </span><span>{</span><span>post_id</span><span>}</span><span>"</span><span>@app.route</span><span>(</span><span>'</span><span>/post/<int:post_id></span><span>'</span><span>)</span> <span>def</span> <span>show_post</span><span>(</span><span>post_id</span><span>):</span> <span>return</span> <span>f</span><span>"</span><span>Post ID: </span><span>{</span><span>post_id</span><span>}</span><span>"</span>@app.route('/post/<int:post_id>') def show_post(post_id): return f"Post ID: {post_id}"
Enter fullscreen mode Exit fullscreen mode
Using Multiple Routes
<span>@app.route</span><span>(</span><span>'</span><span>/contact</span><span>'</span><span>)</span><span>@app.route</span><span>(</span><span>'</span><span>/support</span><span>'</span><span>)</span><span>def</span> <span>contact</span><span>():</span><span>return</span> <span>"</span><span>Contact us at support@example.com</span><span>"</span><span>@app.route</span><span>(</span><span>'</span><span>/contact</span><span>'</span><span>)</span> <span>@app.route</span><span>(</span><span>'</span><span>/support</span><span>'</span><span>)</span> <span>def</span> <span>contact</span><span>():</span> <span>return</span> <span>"</span><span>Contact us at support@example.com</span><span>"</span>@app.route('/contact') @app.route('/support') def contact(): return "Contact us at support@example.com"
Enter fullscreen mode Exit fullscreen mode
4. Flask Templates with Jinja2
Flask uses Jinja2 for rendering dynamic content in HTML.
Creating an HTML Template
Create a templates
directory and add index.html
inside:
<span><!DOCTYPE html></span><span><html></span><span><head></span><span><title></span>Home<span></title></span><span></head></span><span><body></span><span><h1></span>Welcome, {{ name }}!<span></h1></span><span></body></span><span></html></span><span><!DOCTYPE html></span> <span><html></span> <span><head></span> <span><title></span>Home<span></title></span> <span></head></span> <span><body></span> <span><h1></span>Welcome, {{ name }}!<span></h1></span> <span></body></span> <span></html></span><!DOCTYPE html> <html> <head> <title>Home</title> </head> <body> <h1>Welcome, {{ name }}!</h1> </body> </html>
Enter fullscreen mode Exit fullscreen mode
Rendering the Template
<span>from</span> <span>flask</span> <span>import</span> <span>render_template</span><span>@app.route</span><span>(</span><span>'</span><span>/welcome/<string:name></span><span>'</span><span>)</span><span>def</span> <span>welcome</span><span>(</span><span>name</span><span>):</span><span>return</span> <span>render_template</span><span>(</span><span>'</span><span>index.html</span><span>'</span><span>,</span> <span>name</span><span>=</span><span>name</span><span>)</span><span>from</span> <span>flask</span> <span>import</span> <span>render_template</span> <span>@app.route</span><span>(</span><span>'</span><span>/welcome/<string:name></span><span>'</span><span>)</span> <span>def</span> <span>welcome</span><span>(</span><span>name</span><span>):</span> <span>return</span> <span>render_template</span><span>(</span><span>'</span><span>index.html</span><span>'</span><span>,</span> <span>name</span><span>=</span><span>name</span><span>)</span>from flask import render_template @app.route('/welcome/<string:name>') def welcome(name): return render_template('index.html', name=name)
Enter fullscreen mode Exit fullscreen mode
Using Control Structures in Jinja2
<span><ul></span>{% for item in items %}<span><li></span>{{ item }}<span></li></span>{% endfor %}<span></ul></span><span><ul></span> {% for item in items %} <span><li></span>{{ item }}<span></li></span> {% endfor %} <span></ul></span><ul> {% for item in items %} <li>{{ item }}</li> {% endfor %} </ul>
Enter fullscreen mode Exit fullscreen mode
Extending Templates
Create base.html
:
<span><!DOCTYPE html></span><span><html></span><span><head></span><span><title></span>{% block title %}My Site{% endblock %}<span></title></span><span></head></span><span><body></span><span><nav></span>My Navigation Bar<span></nav></span>{% block content %}{% endblock %}<span></body></span><span></html></span><span><!DOCTYPE html></span> <span><html></span> <span><head></span> <span><title></span>{% block title %}My Site{% endblock %}<span></title></span> <span></head></span> <span><body></span> <span><nav></span>My Navigation Bar<span></nav></span> {% block content %}{% endblock %} <span></body></span> <span></html></span><!DOCTYPE html> <html> <head> <title>{% block title %}My Site{% endblock %}</title> </head> <body> <nav>My Navigation Bar</nav> {% block content %}{% endblock %} </body> </html>
Enter fullscreen mode Exit fullscreen mode
Extend in another template:
{% extends "base.html" %}{% block title %}Home{% endblock %}{% block content %}<span><h1></span>Welcome to my site!<span></h1></span>{% endblock %}{% extends "base.html" %} {% block title %}Home{% endblock %} {% block content %} <span><h1></span>Welcome to my site!<span></h1></span> {% endblock %}{% extends "base.html" %} {% block title %}Home{% endblock %} {% block content %} <h1>Welcome to my site!</h1> {% endblock %}
Enter fullscreen mode Exit fullscreen mode
5. Handling Forms and User Authentication
To handle user input, Flask provides the request
object.
<span>from</span> <span>flask</span> <span>import</span> <span>request</span><span>@app.route</span><span>(</span><span>'</span><span>/login</span><span>'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>'</span><span>GET</span><span>'</span><span>,</span> <span>'</span><span>POST</span><span>'</span><span>])</span><span>def</span> <span>login</span><span>():</span><span>if</span> <span>request</span><span>.</span><span>method</span> <span>==</span> <span>'</span><span>POST</span><span>'</span><span>:</span><span>username</span> <span>=</span> <span>request</span><span>.</span><span>form</span><span>[</span><span>'</span><span>username</span><span>'</span><span>]</span><span>return</span> <span>f</span><span>"</span><span>Welcome, </span><span>{</span><span>username</span><span>}</span><span>"</span><span>return</span> <span>'''</span><span><form method=</span><span>"</span><span>post</span><span>"</span><span>>Username: <input type=</span><span>"</span><span>text</span><span>"</span><span> name=</span><span>"</span><span>username</span><span>"</span><span>><input type=</span><span>"</span><span>submit</span><span>"</span><span>></form></span><span>'''</span><span>from</span> <span>flask</span> <span>import</span> <span>request</span> <span>@app.route</span><span>(</span><span>'</span><span>/login</span><span>'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>'</span><span>GET</span><span>'</span><span>,</span> <span>'</span><span>POST</span><span>'</span><span>])</span> <span>def</span> <span>login</span><span>():</span> <span>if</span> <span>request</span><span>.</span><span>method</span> <span>==</span> <span>'</span><span>POST</span><span>'</span><span>:</span> <span>username</span> <span>=</span> <span>request</span><span>.</span><span>form</span><span>[</span><span>'</span><span>username</span><span>'</span><span>]</span> <span>return</span> <span>f</span><span>"</span><span>Welcome, </span><span>{</span><span>username</span><span>}</span><span>"</span> <span>return</span> <span>'''</span><span><form method=</span><span>"</span><span>post</span><span>"</span><span>>Username: <input type=</span><span>"</span><span>text</span><span>"</span><span> name=</span><span>"</span><span>username</span><span>"</span><span>><input type=</span><span>"</span><span>submit</span><span>"</span><span>></form></span><span>'''</span>from flask import request @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] return f"Welcome, {username}" return '''<form method="post">Username: <input type="text" name="username"><input type="submit"></form>'''
Enter fullscreen mode Exit fullscreen mode
User Authentication with Flask-Login
<span>from</span> <span>flask_login</span> <span>import</span> <span>LoginManager</span><span>,</span> <span>UserMixin</span><span>,</span> <span>login_user</span><span>,</span> <span>logout_user</span><span>login_manager</span> <span>=</span> <span>LoginManager</span><span>()</span><span>login_manager</span><span>.</span><span>init_app</span><span>(</span><span>app</span><span>)</span><span>class</span> <span>User</span><span>(</span><span>UserMixin</span><span>):</span><span>pass</span><span>from</span> <span>flask_login</span> <span>import</span> <span>LoginManager</span><span>,</span> <span>UserMixin</span><span>,</span> <span>login_user</span><span>,</span> <span>logout_user</span> <span>login_manager</span> <span>=</span> <span>LoginManager</span><span>()</span> <span>login_manager</span><span>.</span><span>init_app</span><span>(</span><span>app</span><span>)</span> <span>class</span> <span>User</span><span>(</span><span>UserMixin</span><span>):</span> <span>pass</span>from flask_login import LoginManager, UserMixin, login_user, logout_user login_manager = LoginManager() login_manager.init_app(app) class User(UserMixin): pass
Enter fullscreen mode Exit fullscreen mode
6. Flask with Databases (SQLAlchemy)
Flask supports integration with databases using SQLAlchemy.
<span>from</span> <span>flask_sqlalchemy</span> <span>import</span> <span>SQLAlchemy</span><span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>SQLALCHEMY_DATABASE_URI</span><span>'</span><span>]</span> <span>=</span> <span>'</span><span>sqlite:///data.db</span><span>'</span><span>db</span> <span>=</span> <span>SQLAlchemy</span><span>(</span><span>app</span><span>)</span><span>class</span> <span>User</span><span>(</span><span>db</span><span>.</span><span>Model</span><span>):</span><span>id</span> <span>=</span> <span>db</span><span>.</span><span>Column</span><span>(</span><span>db</span><span>.</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>)</span><span>name</span> <span>=</span> <span>db</span><span>.</span><span>Column</span><span>(</span><span>db</span><span>.</span><span>String</span><span>(</span><span>100</span><span>))</span><span>def</span> <span>__repr__</span><span>(</span><span>self</span><span>):</span><span>return</span> <span>f</span><span>"</span><span><User </span><span>{</span><span>self</span><span>.</span><span>name</span><span>}</span><span>></span><span>"</span><span>from</span> <span>flask_sqlalchemy</span> <span>import</span> <span>SQLAlchemy</span> <span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>SQLALCHEMY_DATABASE_URI</span><span>'</span><span>]</span> <span>=</span> <span>'</span><span>sqlite:///data.db</span><span>'</span> <span>db</span> <span>=</span> <span>SQLAlchemy</span><span>(</span><span>app</span><span>)</span> <span>class</span> <span>User</span><span>(</span><span>db</span><span>.</span><span>Model</span><span>):</span> <span>id</span> <span>=</span> <span>db</span><span>.</span><span>Column</span><span>(</span><span>db</span><span>.</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>)</span> <span>name</span> <span>=</span> <span>db</span><span>.</span><span>Column</span><span>(</span><span>db</span><span>.</span><span>String</span><span>(</span><span>100</span><span>))</span> <span>def</span> <span>__repr__</span><span>(</span><span>self</span><span>):</span> <span>return</span> <span>f</span><span>"</span><span><User </span><span>{</span><span>self</span><span>.</span><span>name</span><span>}</span><span>></span><span>"</span>from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) def __repr__(self): return f"<User {self.name}>"
Enter fullscreen mode Exit fullscreen mode
Fetching Data from Database
<span>@app.route</span><span>(</span><span>'</span><span>/users</span><span>'</span><span>)</span><span>def</span> <span>get_users</span><span>():</span><span>users</span> <span>=</span> <span>User</span><span>.</span><span>query</span><span>.</span><span>all</span><span>()</span><span>return</span> <span>{</span><span>"</span><span>users</span><span>"</span><span>:</span> <span>[</span><span>user</span><span>.</span><span>name</span> <span>for</span> <span>user</span> <span>in</span> <span>users</span><span>]}</span><span>@app.route</span><span>(</span><span>'</span><span>/users</span><span>'</span><span>)</span> <span>def</span> <span>get_users</span><span>():</span> <span>users</span> <span>=</span> <span>User</span><span>.</span><span>query</span><span>.</span><span>all</span><span>()</span> <span>return</span> <span>{</span><span>"</span><span>users</span><span>"</span><span>:</span> <span>[</span><span>user</span><span>.</span><span>name</span> <span>for</span> <span>user</span> <span>in</span> <span>users</span><span>]}</span>@app.route('/users') def get_users(): users = User.query.all() return {"users": [user.name for user in users]}
Enter fullscreen mode Exit fullscreen mode
7. Advanced Backend Concepts in Flask
Middleware Implementation
<span>@app.before_request</span><span>def</span> <span>before_request</span><span>():</span><span>print</span><span>(</span><span>"</span><span>Before handling request</span><span>"</span><span>)</span><span>@app.before_request</span> <span>def</span> <span>before_request</span><span>():</span> <span>print</span><span>(</span><span>"</span><span>Before handling request</span><span>"</span><span>)</span>@app.before_request def before_request(): print("Before handling request")
Enter fullscreen mode Exit fullscreen mode
Background Tasks with Celery
<span>from</span> <span>celery</span> <span>import</span> <span>Celery</span><span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>CELERY_BROKER_URL</span><span>'</span><span>]</span> <span>=</span> <span>'</span><span>redis://localhost:6379/0</span><span>'</span><span>celery</span> <span>=</span> <span>Celery</span><span>(</span><span>app</span><span>.</span><span>name</span><span>,</span> <span>broker</span><span>=</span><span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>CELERY_BROKER_URL</span><span>'</span><span>])</span><span>@celery.task</span><span>def</span> <span>background_task</span><span>(</span><span>x</span><span>,</span> <span>y</span><span>):</span><span>return</span> <span>x</span> <span>+</span> <span>y</span><span>from</span> <span>celery</span> <span>import</span> <span>Celery</span> <span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>CELERY_BROKER_URL</span><span>'</span><span>]</span> <span>=</span> <span>'</span><span>redis://localhost:6379/0</span><span>'</span> <span>celery</span> <span>=</span> <span>Celery</span><span>(</span><span>app</span><span>.</span><span>name</span><span>,</span> <span>broker</span><span>=</span><span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>CELERY_BROKER_URL</span><span>'</span><span>])</span> <span>@celery.task</span> <span>def</span> <span>background_task</span><span>(</span><span>x</span><span>,</span> <span>y</span><span>):</span> <span>return</span> <span>x</span> <span>+</span> <span>y</span>from celery import Celery app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0' celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL']) @celery.task def background_task(x, y): return x + y
Enter fullscreen mode Exit fullscreen mode
Caching with Flask-Cache
<span>from</span> <span>flask_caching</span> <span>import</span> <span>Cache</span><span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>CACHE_TYPE</span><span>'</span><span>]</span> <span>=</span> <span>'</span><span>simple</span><span>'</span><span>cache</span> <span>=</span> <span>Cache</span><span>(</span><span>app</span><span>)</span><span>@cache.cached</span><span>(</span><span>timeout</span><span>=</span><span>60</span><span>)</span><span>@app.route</span><span>(</span><span>'</span><span>/cached</span><span>'</span><span>)</span><span>def</span> <span>cached_view</span><span>():</span><span>return</span> <span>"</span><span>This is a cached response.</span><span>"</span><span>from</span> <span>flask_caching</span> <span>import</span> <span>Cache</span> <span>app</span><span>.</span><span>config</span><span>[</span><span>'</span><span>CACHE_TYPE</span><span>'</span><span>]</span> <span>=</span> <span>'</span><span>simple</span><span>'</span> <span>cache</span> <span>=</span> <span>Cache</span><span>(</span><span>app</span><span>)</span> <span>@cache.cached</span><span>(</span><span>timeout</span><span>=</span><span>60</span><span>)</span> <span>@app.route</span><span>(</span><span>'</span><span>/cached</span><span>'</span><span>)</span> <span>def</span> <span>cached_view</span><span>():</span> <span>return</span> <span>"</span><span>This is a cached response.</span><span>"</span>from flask_caching import Cache app.config['CACHE_TYPE'] = 'simple' cache = Cache(app) @cache.cached(timeout=60) @app.route('/cached') def cached_view(): return "This is a cached response."
Enter fullscreen mode Exit fullscreen mode
WebSockets with Flask-SocketIO
<span>from</span> <span>flask_socketio</span> <span>import</span> <span>SocketIO</span><span>socketio</span> <span>=</span> <span>SocketIO</span><span>(</span><span>app</span><span>)</span><span>@socketio.on</span><span>(</span><span>'</span><span>message</span><span>'</span><span>)</span><span>def</span> <span>handle_message</span><span>(</span><span>msg</span><span>):</span><span>print</span><span>(</span><span>'</span><span>Received message:</span><span>'</span><span>,</span> <span>msg</span><span>)</span><span>from</span> <span>flask_socketio</span> <span>import</span> <span>SocketIO</span> <span>socketio</span> <span>=</span> <span>SocketIO</span><span>(</span><span>app</span><span>)</span> <span>@socketio.on</span><span>(</span><span>'</span><span>message</span><span>'</span><span>)</span> <span>def</span> <span>handle_message</span><span>(</span><span>msg</span><span>):</span> <span>print</span><span>(</span><span>'</span><span>Received message:</span><span>'</span><span>,</span> <span>msg</span><span>)</span>from flask_socketio import SocketIO socketio = SocketIO(app) @socketio.on('message') def handle_message(msg): print('Received message:', msg)
Enter fullscreen mode Exit fullscreen mode
Read that article with Examples
Conclusion
Flask is a powerful framework that provides the flexibility to develop everything from simple web pages to complex APIs. By mastering Flask, developers can efficiently build scalable and maintainable applications. This guide covered everything from setup to deployment, authentication, databases, middleware, caching, WebSockets, and background tasks, providing a strong foundation for working with Flask.
暂无评论内容