DEV Community

Cover image for Day-6 Flask Server
Pranjal Sharma
Pranjal Sharma

Posted on

Day-6 Flask Server

Hey, fellow code adventurers! Get ready to hop on the Flask, I am very excited to move to the next step,

Night Coder



Today's Agenda-
  1. Introduction to Flask:

    • Overview of Flask and its simplicity.
  2. Installing Flask:

    • Step-by-step guide on installing Flask.
  3. Hello World in Flask:

    • Creating a basic "Hello World" application.
  4. Routing in Flask:

    • Understanding routes and basic route handling.
  5. Templates and Static Files:

    • Introduction to templates and serving static files.
  6. Handling Forms:

    • Basic form handling in Flask.
  7. Database Connection:

    • Simple connection to a database.
  8. Deployment Basics:

    • Brief overview of deploying a Flask app locally.
  9. Error Handling:

    • Basic error handling and debugging.

Introduction to Flask: Simplicity in Web Development

Flask is a lightweight and user-friendly web framework for Python, designed to make web development straightforward and efficient. Its simplicity lies in its minimalist design and ease of use, making it an excellent choice for beginners and those looking for a quick and uncomplicated way to build web applications. Flask follows the "micro" framework philosophy, providing just what you need to get started without imposing unnecessary structures. With Flask, you can focus on your application's logic, making it an ideal entry point for anyone venturing into web development with Python.



Installing Flask: A Quick Guide
  1. Prerequisites:
    Ensure you have Python installed on your system. You can download it from python.org.

  2. Virtual Environment (Optional but Recommended):
    Create a virtual environment to isolate your Flask project. Run:

   python -m venv myenv
Enter fullscreen mode Exit fullscreen mode
  1. Activate the Virtual Environment: On Windows:
   myenv\Scripts\activate
Enter fullscreen mode Exit fullscreen mode

On macOS/Linux:

   source myenv/bin/activate
Enter fullscreen mode Exit fullscreen mode
  1. Install Flask: With your virtual environment activated, install Flask using pip:
   pip install Flask
Enter fullscreen mode Exit fullscreen mode
  1. Verify Installation: Create a simple Flask app (e.g., app.py) with the following code:
   from flask import Flask
   app = Flask(__name__)

   @app.route('/')
   def hello():
       return 'Hello, Flask!'

   if __name__ == '__main__':
       app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode
  1. Run the App: Execute the following command in your terminal:
   python app.py
Enter fullscreen mode Exit fullscreen mode

Visit http://127.0.0.1:5000/ in your browser; you should see "Hello, Flask!"

That's it! You've successfully installed and run your first Flask application.



Routing in Flask: Navigating Your Web Application

In Flask, routing is the mechanism that directs incoming requests to the appropriate view function. Here's a brief guide on understanding routes:

  1. Define Routes:
    • Routes are URLs that users can visit.
    • Use the @app.route() decorator to associate a URL with a view function.
   from flask import Flask

   app = Flask(__name__)

   @app.route('/')
   def home():
       return 'Welcome to the Home Page!'

   @app.route('/about')
   def about():
       return 'Learn more about us here.'
Enter fullscreen mode Exit fullscreen mode
  1. Basic Route Handling:

    • Define functions to handle specific routes.
    • When a user visits a defined route, the associated function is executed.
  2. Dynamic Routes:

    • Include variable parts in the URL to make dynamic routes.
    • Extract variables from the URL using <variable_type:variable_name>.
   @app.route('/user/<username>')
   def show_user_profile(username):
       return f'User: {username}'
Enter fullscreen mode Exit fullscreen mode
  1. HTTP Methods:
    • Routes can handle different HTTP methods (GET by default).
    • Use the methods parameter to specify allowed methods.
   @app.route('/submit', methods=['POST'])
   def submit_form():
       # Handle form submission
       return 'Form submitted successfully!'
Enter fullscreen mode Exit fullscreen mode

Understanding these basics will empower you to create navigation paths and handle user requests effectively in your Flask web application.



Templates and Static Files in Flask: Enhancing Your Web Pages
  1. Introduction to Templates:
    • Templates in Flask are HTML files with placeholders for dynamic content.
    • Use the Jinja2 templating engine to render dynamic data.
   <!-- Example template: templates/index.html -->
   <html>
   <body>
       <h1>{{ title }}</h1>
       <p>{{ content }}</p>
   </body>
   </html>
Enter fullscreen mode Exit fullscreen mode
  1. Rendering Templates:
    • Render templates using the render_template function in your route handlers.
   from flask import Flask, render_template

   app = Flask(__name__)

   @app.route('/')
   def home():
       return render_template('index.html', title='Welcome', content='This is your home page.')
Enter fullscreen mode Exit fullscreen mode
  1. Serving Static Files:
    • Place static files (CSS, JS, images) in the static folder in your project directory.
   project/
   ├── app.py
   ├── templates/
   │   └── index.html
   └── static/
       └── style.css
Enter fullscreen mode Exit fullscreen mode
  1. Linking Static Files:
    • Link static files in your templates using the url_for function.
   <!-- Linking CSS in a template -->
   <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
Enter fullscreen mode Exit fullscreen mode
  1. Dynamic Content in Templates:
    • Pass dynamic data from your route handler to the template for personalized content.
   @app.route('/user/<username>')
   def user_profile(username):
       return render_template('profile.html', username=username)
Enter fullscreen mode Exit fullscreen mode

Understanding templates and serving static files enhances the visual appeal and interactivity of your Flask web application by separating structure from content and efficiently managing static resources.



Handling Forms in Flask: Capturing User Input
  1. HTML Forms:
    • Create HTML forms in your templates to collect user input.
   <!-- Example form: templates/login.html -->
   <form action="/login" method="post">
       <label for="username">Username:</label>
       <input type="text" id="username" name="username">
       <input type="submit" value="Login">
   </form>
Enter fullscreen mode Exit fullscreen mode
  1. Handling Form Submission:
    • Use the request object in Flask to access form data.
   from flask import Flask, render_template, request

   app = Flask(__name__)

   @app.route('/login', methods=['POST'])
   def login():
       username = request.form.get('username')
       # Process and validate user input
       return f'Welcome, {username}!'
Enter fullscreen mode Exit fullscreen mode
  1. Form Validation:
    • Implement validation logic to ensure the submitted data is correct.
   @app.route('/signup', methods=['POST'])
   def signup():
       username = request.form.get('username')
       email = request.form.get('email')

       # Validate username and email
       # ...

       return f'Thanks for signing up, {username}!'
Enter fullscreen mode Exit fullscreen mode
  1. Flash Messages:
    • Provide feedback to users using Flask's flash feature.
   from flask import Flask, render_template, request, flash, redirect, url_for

   app = Flask(__name__)
   app.secret_key = 'your_secret_key'

   @app.route('/login', methods=['POST'])
   def login():
       username = request.form.get('username')

       if username == 'admin':
           flash('Login successful!', 'success')
       else:
           flash('Invalid username', 'error')

       return redirect(url_for('login_page'))
Enter fullscreen mode Exit fullscreen mode
  1. HTML and CSS Integration:
    • Combine form handling with HTML and CSS for a seamless user experience.
   <!-- Styling a form with CSS -->
   <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
Enter fullscreen mode Exit fullscreen mode

By integrating form handling in your Flask application, you can efficiently capture and process user input, providing a dynamic and interactive user experience.



Handling Forms in Flask: Capturing User Input
  1. HTML Forms:
    • Create HTML forms in your templates to collect user input.
   <!-- Example form: templates/login.html -->
   <form action="/login" method="post">
       <label for="username">Username:</label>
       <input type="text" id="username" name="username">
       <input type="submit" value="Login">
   </form>
Enter fullscreen mode Exit fullscreen mode
  1. Handling Form Submission:
    • Use the request object in Flask to access form data.
   from flask import Flask, render_template, request

   app = Flask(__name__)

   @app.route('/login', methods=['POST'])
   def login():
       username = request.form.get('username')
       # Process and validate user input
       return f'Welcome, {username}!'
Enter fullscreen mode Exit fullscreen mode
  1. Form Validation:
    • Implement validation logic to ensure the submitted data is correct.
   @app.route('/signup', methods=['POST'])
   def signup():
       username = request.form.get('username')
       email = request.form.get('email')

       # Validate username and email
       # ...

       return f'Thanks for signing up, {username}!'
Enter fullscreen mode Exit fullscreen mode
  1. Flash Messages:
    • Provide feedback to users using Flask's flash feature.
   from flask import Flask, render_template, request, flash, redirect, url_for

   app = Flask(__name__)
   app.secret_key = 'your_secret_key'

   @app.route('/login', methods=['POST'])
   def login():
       username = request.form.get('username')

       if username == 'admin':
           flash('Login successful!', 'success')
       else:
           flash('Invalid username', 'error')

       return redirect(url_for('login_page'))
Enter fullscreen mode Exit fullscreen mode
  1. HTML and CSS Integration:
    • Combine form handling with HTML and CSS for a seamless user experience.
   <!-- Styling a form with CSS -->
   <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
Enter fullscreen mode Exit fullscreen mode

By integrating form handling in your Flask application, you can efficiently capture and process user input, providing a dynamic and interactive user experience.



Database Connection in Flask with MongoDB: Getting Started
  1. Install Flask-PyMongo:
    • Use Flask-PyMongo extension to connect Flask with MongoDB.
   pip install Flask-PyMongo
Enter fullscreen mode Exit fullscreen mode
  1. Initialize and Configure:
    • In your Flask app, initialize and configure Flask-PyMongo.
   from flask import Flask
   from flask_pymongo import PyMongo

   app = Flask(__name__)
   app.config['MONGO_URI'] = 'mongodb://localhost:27017/your-database-name'
   mongo = PyMongo(app)
Enter fullscreen mode Exit fullscreen mode
  1. Connecting to MongoDB:
    • Use the mongo.db object to interact with the MongoDB database.
   @app.route('/users')
   def get_users():
       users_collection = mongo.db.users
       users = users_collection.find()
       # Process and return user data
Enter fullscreen mode Exit fullscreen mode
  1. Inserting Data:
    • Insert data into MongoDB using the insert_one or insert_many methods.
   @app.route('/add_user')
   def add_user():
       user_data = {'username': 'john_doe', 'email': 'john@example.com'}
       result = users_collection.insert_one(user_data)
       # Handle result
Enter fullscreen mode Exit fullscreen mode
  1. Querying Data:
    • Use MongoDB queries to retrieve specific data.
   @app.route('/user/<username>')
   def get_user(username):
       user = users_collection.find_one({'username': username})
       # Process and return user data
Enter fullscreen mode Exit fullscreen mode
  1. Updating and Deleting:
    • Use update_one, update_many, delete_one, and delete_many for modifying data.
   @app.route('/update_user/<username>')
   def update_user(username):
       users_collection.update_one({'username': username}, {'$set': {'email': 'new_email@example.com'}})
       # Handle update result
Enter fullscreen mode Exit fullscreen mode
  1. Closing Connection:
    • Flask-PyMongo manages connections automatically. No need to explicitly close.
   @app.route('/close_connection')
   def close_connection():
       # No explicit closing needed
       pass
Enter fullscreen mode Exit fullscreen mode

By following these steps, you can establish a simple connection between your Flask application and a MongoDB database, allowing you to perform basic CRUD (Create, Read, Update, Delete) operations seamlessly.



Deployment Basics for a Flask App: Local Deployment
  1. Install a Web Server:
    • Use a web server like Gunicorn for production-like deployment.
   pip install gunicorn
Enter fullscreen mode Exit fullscreen mode
  1. Export Flask App:
    • Export your Flask app as a module.
   export FLASK_APP=your_app_name
Enter fullscreen mode Exit fullscreen mode
  1. Run Gunicorn:
    • Start Gunicorn with the command:
   gunicorn -w 4 your_app_name:app
Enter fullscreen mode Exit fullscreen mode

This runs the app with 4 worker processes.

  1. Visit Localhost:

    • Open your web browser and visit http://127.0.0.1:8000/ to see your deployed Flask app.
  2. Stop Gunicorn:

    • Press Ctrl+C in the terminal to stop Gunicorn.

This basic deployment allows you to run your Flask app locally using Gunicorn, simulating a production environment. For more robust deployment, consider using tools like Nginx and uWSGI or platforms like Heroku, AWS, or GCP.



Error Handling in Flask: Navigating Issues with Grace
  1. Debug Mode:
    • While developing, enable Flask's debug mode for detailed error messages.
   app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode
  1. HTTP Error Codes:
    • Customize error pages for common HTTP error codes.
   @app.errorhandler(404)
   def page_not_found(error):
       return render_template('404.html'), 404
Enter fullscreen mode Exit fullscreen mode
  1. Exception Handling:
    • Catch exceptions within your routes for specific error handling.
   @app.route('/divide')
   def divide():
       try:
           result = 10 / 0
           return str(result)
       except ZeroDivisionError:
           return 'Error: Cannot divide by zero!'
Enter fullscreen mode Exit fullscreen mode
  1. Logging:
    • Utilize Flask's built-in logging to record errors and debug information.
   import logging

   app.logger.setLevel(logging.DEBUG)
Enter fullscreen mode Exit fullscreen mode
  1. Flask Debug Toolbar:
    • Enhance debugging with the Flask Debug Toolbar extension.
   from flask_debugtoolbar import DebugToolbarExtension

   toolbar = DebugToolbarExtension(app)
Enter fullscreen mode Exit fullscreen mode
  1. Handling Unhandled Exceptions:
    • Use a generic error handler for unhandled exceptions.
   @app.errorhandler(Exception)
   def handle_exception(e):
       # Log the exception
       app.logger.error(f'Unhandled Exception: {str(e)}')
       return 'Something went wrong!', 500
Enter fullscreen mode Exit fullscreen mode
  1. Interactive Debugger:
    • Activate Flask's interactive debugger to inspect variables and step through code.
   app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode

Implementing these error-handling techniques in your Flask application will aid in identifying, understanding, and gracefully handling errors during development and production.



The next blog will continue this for SQL and advanced topics in Flask. Stay connected. Please, visit the github.

Drop by our Telegram Channel and let the adventure begin! See you there, Data Explorer! 🌐🚀

Top comments (5)

Collapse
 
dyfet profile image
David Sugar

I lost all interest in Flask the day I learned ruby and sinatra. Sinatra is much more expressive and eliminates lots of boilerplate code. On average my sinatra version of a flask service was half the code, easier to read, and ran as fast. This is especially true with sql queries or converting json arguments.

Eventually I did move on from ruby to go because it is faster than either and sat somewhere in complexity between sinatra and flask for writing web service apis. But to me, flask is another ancient thing that should be abandoned, like the perl frameworks that existed before it.

Collapse
 
janmpeterka profile image
Jan Peterka

I recently moved from Flask to Rails for my apps. It's so much easier and cleaner!
I've already rewritten one of my apps, working on the second one.

But! I'm glad for my experience with Flask, as I have more understanding for what's happening "under the hood", and I tried writing some helpers and "magic" seen in Rails in Flask/Python. it was bit frustrating, but it makes me appreciate how well thought Rails is.

There is still value in Flask in my opinion - for small things, experimental things,..
But most of the time I'll prefer Rails from now on.

(Also, one of my pain points was ORM. I really didn't like SQLAlchemy, and didn't find much an alternative in Python space. SQLAlchemy 2.0 made it even worse. Maybe I just didn't understand some basic paradigm about it/data mapping, but I'm much happier with Active Record, which just seems so natural to define)

Collapse
 
dyfet profile image
David Sugar

Indeed. Sinatra is kinda like a mini-rails in Ruby, but the same points do apply. Active record is very intuitive, too. It, rails, sinatra, all touch upon what I like most about Ruby in general; being able to integrate different things into a solid and simple dsl, and then expressing the problem you are solving in just that.

Collapse
 
janmpeterka profile image
Jan Peterka • Edited

Also, I used Flask-Classful, which made it much more enjoyable!

Collapse
 
naikg profile image
Nagesh Naik

Nice