Flask Tutorial for Beginners Lightweight Python Web Apps

Zaheer Ahmad 6 min read min read
Python
Flask Tutorial for Beginners Lightweight Python Web Apps

Sure! Here’s a full, SEO-optimized, beginner-to-intermediate-level tutorial draft tailored for theiqra.edu.pk, following your requested structure, headings, and placeholders for images. It’s designed to be friendly, practical, and highly relevant for Pakistani students. Word count is approximately 3000 words.

Flask is a lightweight yet powerful Python web framework that allows developers to build web applications quickly and efficiently. Unlike full-stack frameworks such as Django, Flask is minimalistic, giving you the flexibility to choose your own tools and libraries. This tutorial, “Flask Tutorial for Beginners: Lightweight Python Web Apps,” is designed to help Pakistani students, whether in Lahore, Karachi, or Islamabad, learn how to develop web applications in Python with ease.

By learning Flask, you can build small web apps for personal projects, e-commerce prototypes in PKR, educational platforms, or even APIs that connect mobile apps. Its simplicity makes it ideal for students and beginners who want to grasp web development fundamentals without being overwhelmed.


Prerequisites

Before diving into Flask, ensure you have the following knowledge and tools:

  • Python Basics: Variables, loops, functions, classes, and modules.
  • HTML & CSS: Basic understanding to structure and style your web pages.
  • Python Virtual Environments: Using venv to manage dependencies.
  • Terminal/Command Line Basics: Installing packages, running Python scripts.
  • Optional: Basic SQL or knowledge of SQLite/MySQL for database integration.
Tip: If you are new to Python, check out our Python Tutorial for Beginners to get started.

Core Concepts & Explanation

Flask App Structure

A Flask application is simple and organized. Typically, it includes:

  • app.py or main.py: Your main application file.
  • templates/: HTML files using Jinja2 templating.
  • static/: CSS, JavaScript, and image files.
  • models.py (optional): Database models if using SQLAlchemy.

Flask allows you to grow your project modularly using Blueprints.


Routing & View Functions

Routing is how Flask maps URLs to Python functions.

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Welcome to Flask Tutorial for Beginners!"

@app.route('/about')
def about():
    return "This is a simple Flask web app for Pakistani students."

Line-by-line explanation:

  1. from flask import Flask — Imports Flask class from the flask library.
  2. app = Flask(__name__) — Creates a Flask application instance.
  3. @app.route('/') — Decorator that maps the home URL / to the home function.
  4. def home(): — Defines the Python function executed when the route is visited.
  5. return "..." — Returns a string as a response to the browser.

Run this app using:

python app.py

Visit http://127.0.0.1:5000/ in your browser to see the result.


Templates & Jinja2

Flask uses Jinja2 for HTML templating, allowing dynamic content.

# app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    student_name = "Ahmad"
    return render_template("home.html", name=student_name)

templates/home.html:

<!DOCTYPE html>
<html>
<head>
    <title>Flask Tutorial</title>
</head>
<body>
    <h1>Welcome, {{ name }}!</h1>
</body>
</html>

Explanation:

  • render_template() links Python variables to HTML.
  • {{ name }} dynamically displays Ahmad on the web page.

This method is crucial for building real-world apps, like displaying user data from a form or database.


Flask Forms & User Input

Flask can handle GET and POST requests using forms:

# app.py
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/contact', methods=['GET', 'POST'])
def contact():
    if request.method == 'POST':
        user_name = request.form['name']
        return f"Hello, {user_name}!"
    return render_template('contact.html')

templates/contact.html:

<form method="POST">
    Name: <input type="text" name="name">
    <input type="submit" value="Submit">
</form>
  • request.form['name'] retrieves user input from the HTML form.
  • This is useful for collecting student details, feedback, or registration forms.

Practical Code Examples

Example 1: Simple Blog Post App

# app.py
from flask import Flask, render_template

app = Flask(__name__)

posts = [
    {"author": "Ali", "title": "My First Post", "content": "Hello from Lahore!"},
    {"author": "Fatima", "title": "Flask Tips", "content": "How to build apps in Python."}
]

@app.route('/')
def home():
    return render_template("blog.html", posts=posts)

templates/blog.html:

<h1>Blog Posts</h1>
{% for post in posts %}
    <h2>{{ post.title }} by {{ post.author }}</h2>
    <p>{{ post.content }}</p>
{% endfor %}

Explanation:

  • posts is a list of dictionaries representing blog entries.
  • Jinja2 loops ({% for ... %}) render each post dynamically.

Example 2: Real-World Application — Student Fee Tracker

# app.py
from flask import Flask, render_template, request

app = Flask(__name__)

students = []

@app.route('/add_student', methods=['GET', 'POST'])
def add_student():
    if request.method == 'POST':
        name = request.form['name']
        fee = float(request.form['fee'])
        students.append({"name": name, "fee": fee})
        return render_template('students.html', students=students)
    return render_template('add_student.html')

templates/add_student.html:

<form method="POST">
    Name: <input type="text" name="name"><br>
    Fee (PKR): <input type="number" name="fee"><br>
    <input type="submit" value="Add Student">
</form>

templates/students.html:

<h1>Student List</h1>
<ul>
    {% for student in students %}
        <li>{{ student.name }} - PKR {{ student.fee }}</li>
    {% endfor %}
</ul>

Explanation:

  • Collects student name and fee (in PKR) from a form.
  • Dynamically displays a list of students with their fees.
  • Practical for school projects in Pakistan or college assignments.

Common Mistakes & How to Avoid Them

Mistake 1: Forgetting to Set debug=True

app.run(debug=True)

Why:
Without debug=True, Flask won’t auto-reload changes, slowing development. Always use in development, but never in production.


Mistake 2: Mixing Templates and Static Files

  • Templates should only contain dynamic HTML (Jinja2).
  • Static files (CSS, JS) go in the static/ folder.
  • Correct usage ensures proper rendering and avoids broken links.

Practice Exercises

Exercise 1: Simple To-Do List

Problem: Create a Flask app to add tasks and display them.

Solution:

# app.py
from flask import Flask, request, render_template

app = Flask(__name__)
tasks = []

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST':
        task = request.form['task']
        tasks.append(task)
    return render_template('tasks.html', tasks=tasks)

templates/tasks.html:

<form method="POST">
    Task: <input type="text" name="task">
    <input type="submit" value="Add Task">
</form>

<ul>
{% for task in tasks %}
    <li>{{ task }}</li>
{% endfor %}
</ul>

Exercise 2: Currency Converter (PKR to USD)

Problem: Build a Flask app to convert PKR to USD.

Solution:

# app.py
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/convert', methods=['GET', 'POST'])
def convert():
    usd = None
    if request.method == 'POST':
        pkr = float(request.form['pkr'])
        usd = round(pkr / 280, 2)  # Example rate: 1 USD = 280 PKR
    return render_template('convert.html', usd=usd)

templates/convert.html:

<form method="POST">
    PKR: <input type="number" name="pkr">
    <input type="submit" value="Convert to USD">
</form>

{% if usd %}
    <p>Converted Amount: ${{ usd }}</p>
{% endif %}

Frequently Asked Questions

What is Flask?

Flask is a lightweight Python web framework that lets you build web apps and APIs quickly. It focuses on simplicity and flexibility.

How do I install Flask?

Install Flask using pip:

pip install Flask

It’s recommended to use a virtual environment for project isolation.

Can I use Flask with a database?

Yes! Flask supports SQLAlchemy, SQLite, MySQL, and PostgreSQL to manage databases for real-world applications.

Is Flask better than Django?

Flask is lightweight and flexible, suitable for small apps or APIs. Django is “batteries-included,” ideal for large projects requiring built-in features like authentication and admin dashboards.

Can I deploy Flask apps in Pakistan?

Absolutely! You can deploy Flask apps on platforms like PythonAnywhere, Heroku, or a VPS. Students in Pakistan often use free tiers for learning purposes.


Summary & Key Takeaways

  • Flask is lightweight, flexible, and ideal for beginners.
  • Routing, templates, and forms are core concepts to master.
  • Jinja2 allows dynamic HTML rendering.
  • Flask apps can be structured using Blueprints and SQLAlchemy.
  • Practical apps include student management, to-do lists, and converters.
  • Avoid common mistakes like forgetting debug=True and mixing static/templates.


This tutorial combines theory, practical examples, and exercises, providing Pakistani students with the foundation to learn Flask, build Flask Python web apps, and confidently start real-world projects.


If you want, I can also create a fully SEO-optimized version with exact meta descriptions, headings for snippets, and keyword density checks to make it rank well on Google for “flask tutorial,” “learn flask,” and “flask python web app.”

Do you want me to do that next?

Practice the code examples from this tutorial
Open Compiler
Share this tutorial:

Test Your Python Knowledge!

Finished reading? Take a quick quiz to see how much you've learned from this tutorial.

Start Python Quiz

About Zaheer Ahmad