Table of Contents
- Overview
- Prerequisites
- Installation
- Creating a Basic Flask Application
- Routing
- Templates
- Forms
- Database Integration
- Authentication and Authorization
- Deployment
Overview
Welcome to this tutorial on Python’s Flask microframework! Flask is a powerful web framework that allows you to build web applications with ease. In this tutorial, we will cover the basics of Flask and guide you through the process of creating a basic web application using Flask.
By the end of this tutorial, you will have a good understanding of Flask’s key features and be able to build your own web applications using this microframework.
Prerequisites
To follow along with this tutorial, you should have a basic understanding of Python programming language. Familiarity with HTML, CSS, and JavaScript will also be helpful, but not required.
Installation
Before we begin, let’s make sure Flask is installed on your system. Assuming you have Python already installed, you can install Flask using pip, the package manager for Python. Open your terminal or command prompt and run the following command:
plaintext
pip install flask
This will download and install the latest version of Flask along with its dependencies.
Creating a Basic Flask Application
Let’s start by creating a basic Flask application. Here are the steps:
- Create a new directory for your application and navigate to it in your terminal.
- Create a new Python file called
app.py
using your preferred text editor. - Open
app.py
and import Flask:from flask import Flask app = Flask(__name__)
- Define a route for the root URL (“/”) that returns a simple “Hello, Flask!” message:
@app.route('/') def hello(): return "Hello, Flask!"
- Add a condition to check if
app.py
is the main module and run the application:if __name__ == '__main__': app.run(debug=True)
Your
app.py
file should now look like this:from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello, Flask!" if __name__ == '__main__': app.run(debug=True)
- Save the file and run it using the following command:
python app.py
You should see an output similar to the following: ```plaintext
- Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
Congratulations! You have just created a basic Flask application. Open your web browser and navigate to the URL
http://127.0.0.1:5000/
. You should see the “Hello, Flask!” message displayed in your browser.
- Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
Congratulations! You have just created a basic Flask application. Open your web browser and navigate to the URL
Routing
Routing is an essential part of any web application. It allows you to define different URLs (or routes) that correspond to different sections or functionalities of your application.
In Flask, you can define routes using the @app.route
decorator. Let’s update our app.py
file to include multiple routes:
```python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Flask!"
@app.route('/about')
def about():
return "This is the about page!"
@app.route('/contact')
def contact():
return "Contact us at [email protected]"
if __name__ == '__main__':
app.run(debug=True)
``` Save the file and run it again using `python app.py`. Now, if you navigate to `http://127.0.0.1:5000/about`, you should see the message "This is the about page!" displayed. Similarly, `http://127.0.0.1:5000/contact` should show you the contact information.
You can also pass variables in the routes. For example, let’s create a route that accepts a name parameter and returns a personalized message:
python
@app.route('/hello/<name>')
def greeting(name):
return f"Hello, {name}!"
Now, if you navigate to http://127.0.0.1:5000/hello/John
, you should see the message “Hello, John!” displayed. The value after the /hello/
part of the URL will be passed as the name
parameter to the greeting
function.
Templates
Templates are used to separate the presentation logic from the business logic of your application. Flask uses the Jinja2 template engine by default, which allows you to build dynamic HTML pages.
To use templates in Flask, you need to create a templates
directory in your application’s root directory. Inside the templates
directory, create an HTML template file. Let’s create a simple template called index.html
:
html
<!DOCTYPE html>
<html>
<head>
<title>Flask Application</title>
</head>
<body>
<h1></h1>
</body>
</html>
Now, update your app.py
file to render the index.html
template instead of returning a plain string:
```python
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def hello():
return render_template('index.html', message='Hello, Flask!')
if __name__ == '__main__':
app.run(debug=True)
``` Save the files and run your application. Open `http://127.0.0.1:5000/` in your browser, and you should see the rendered template with the message "Hello, Flask!".
Templates can also contain dynamic elements such as loops and conditionals. Refer to the Jinja2 documentation for more information on how to use templates effectively in your Flask applications.
Forms
Processing user input is a common task in web applications. Flask provides a simple way to handle forms using the request
object.
To demonstrate this, let’s create a simple contact form. First, update the index.html
template to include a form:
```html
<!DOCTYPE html>
<html>
<head>
<form action="/submit" method="POST">
<label for="name">Name: </label>
<input type="text" id="name" name="name" required><br>
<label for="email">Email: </label>
<input type="email" id="email" name="email" required><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
``` Next, update your `app.py` file to handle the form submission:
```python
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def hello():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
# Do something with the submitted data here
return f"Thank you for submitting the form, {name}!"
return render_template('index.html', message='Hello, Flask!')
if __name__ == '__main__':
app.run(debug=True)
``` Save the files and run your application. Open `http://127.0.0.1:5000/` in your browser, and you should see the contact form. Try submitting the form with a name and email address, and you should see a message thanking you for the submission.
Flask makes it easy to validate and process form data using the request
object. You can access form data by using the request.form
dictionary-like object.
Database Integration
Flask integrates well with various databases, allowing you to build database-backed web applications. SQLAlchemy is a popular Python SQL toolkit and Object-Relational Mapping (ORM) library that works well with Flask.
To demonstrate database integration, we’ll use SQLite and SQLAlchemy.
First, install SQLAlchemy by running the following command:
plaintext
pip install flask-sqlalchemy
Next, update your app.py
file to configure the database and define a model class:
```python
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(100), nullable=False)
@app.route('/', methods=['GET', 'POST'])
def hello():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
user = User(name=name, email=email)
db.session.add(user)
db.session.commit()
return f"Thank you for submitting the form, {name}!"
return render_template('index.html', message='Hello, Flask!')
if __name__ == '__main__':
app.run(debug=True)
``` This code sets up a SQLite database and defines a `User` model class using SQLAlchemy's declarative syntax.
Save the files and run your application. Open http://127.0.0.1:5000/
in your browser, submit the form, and the user data will be stored in the database.
Flask’s integration with SQLAlchemy makes it easy to interact with databases and perform database operations.
Authentication and Authorization
Authenticating users and implementing authorization are essential for many web applications. Flask provides several extensions that make it easy to handle authentication and authorization tasks.
For this tutorial, we’ll use the Flask-Login extension to handle user authentication and Flask-Principal for managing user roles and permissions.
First, install the required extensions by running the following command:
plaintext
pip install flask-login flask-principal
Next, update your app.py
file to configure the extensions and define a basic login functionality:
```python
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required
from flask_principal import Principal, Identity, AnonymousIdentity, RoleNeed
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SECRET_KEY'] = 'your-secret-key'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
principal = Principal(app)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(100), nullable=False)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@login_manager.unauthorized_handler
def unauthorized_callback():
return redirect(url_for('login'))
@app.route('/', methods=['GET', 'POST'])
@login_required
def hello():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
user = User(name=name, email=email)
db.session.add(user)
db.session.commit()
return f"Thank you for submitting the form, {name}!"
return render_template('index.html', message='Hello, Flask!')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
email = request.form['email']
user = User.query.filter_by(email=email).first()
if user:
login_user(user)
identity = Identity(user.id)
principal.identity_changed.send(app, identity=identity)
return redirect(url_for('hello'))
return redirect(url_for('login'))
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
principal.identity_changed.send(app, identity=AnonymousIdentity())
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True)
``` This code sets up the Flask-Login and Flask-Principal extensions and defines a basic login functionality. We also added a `login.html` template for the login page.
Save the files and run your application. Open http://127.0.0.1:5000/
in your browser, and you’ll be redirected to the login page. Try submitting the login form using an email address that exists in the database, and you’ll be redirected to the home page. If you try accessing http://127.0.0.1:5000/
without logging in, you’ll be redirected to the login page.
Flask-Login and Flask-Principal make it easy to handle user authentication and authorization tasks in your Flask applications.
Deployment
Once you have developed your Flask application, you’ll want to deploy it to a production server. Flask applications can be deployed using various methods, including traditional web servers, cloud platforms, and containerization.
One popular deployment option is using a web server like Nginx or Apache with WSGI (Web Server Gateway Interface). WSGI is a specification that defines a common interface for web servers and web applications to communicate.
To deploy a Flask application using WSGI, you’ll need a WSGI server. One popular choice is Gunicorn. To install Gunicorn, run the following command:
plaintext
pip install gunicorn
Next, create a new file called wsgi.py
in your application’s root directory with the following content:
```python
from app import app
if __name__ == '__main__':
app.run()
``` This file imports the `app` object from your `app.py` module and runs the Flask application when executed directly.
You can now use Gunicorn to run your Flask application in production. Open your terminal and navigate to your application’s root directory, then run the following command:
plaintext
gunicorn wsgi:app
This command starts Gunicorn and runs your Flask application using the wsgi:app
argument. You can then configure a web server like Nginx or Apache to proxy requests to Gunicorn.
Deployment is a vast topic, and the method you choose depends on your specific requirements and infrastructure. Consult the Flask documentation and relevant platform-specific documentation to learn more about deploying Flask applications.
Recap
In this tutorial, we have covered the basics of Flask, a microframework for building web applications in Python. We started by creating a basic Flask application and learned how to define routes, use templates, handle forms, integrate databases, and implement authentication and authorization. We also briefly touched on deployment options for Flask applications.
Flask provides a lightweight and flexible framework for building web applications with Python. It offers a wide range of extensions and libraries that make it even more powerful and versatile. With the knowledge gained from this tutorial, you can now start exploring advanced concepts and building more complex web applications using Flask.
Remember to refer to the Flask documentation and the documentation of any third-party libraries or extensions you use for more detailed information and advanced features.
Happy coding with Flask!