DEV Community

yosi
yosi

Posted on

Building a Python Web App with Flask and Nginx

In Python web development, two essential components come into play: web frameworks and web servers. While they work together to handle incoming requests and generate responses, they have distinct roles. In this article, we'll explore the difference between them and understand the role of WSGI (Web Server Gateway Interface).

Web Frameworks

A web framework is a software library or toolkit that simplifies web application development. It provides a set of pre-defined tools, utilities, and abstractions to streamline common web development tasks. These frameworks handle crucial aspects such as URL routing, request handling, database integration, templating, and more. Python boasts several popular web frameworks, including Django, Flask, and Pyramid.

Web Servers

On the other hand, a web server is responsible for receiving incoming HTTP requests from clients (e.g., web browsers) and sending back HTTP responses. It serves as the intermediary between clients and web applications. Web servers listen on specific network ports, handle low-level communication, and manage the execution of web applications. Commonly used web servers with Python include Apache HTTP Server, Nginx, and Gunicorn.

WSGI

The Web Server Gateway Interface (WSGI) acts as a standard interface between web servers and web applications or frameworks in Python. It establishes a bridge that allows communication between these components. WSGI defines a set of methods that web servers call on web applications or frameworks to handle requests and generate responses.

This separation of concerns facilitated by WSGI allows different web servers and web frameworks to seamlessly work together.

Flask and Ngnix

Lets explore the process of building a Python web application using Flask, a lightweight and flexible web framework, along with Nginx, a high-performance web server. By combining Flask's simplicity with Nginx's scalability, we can create a robust and efficient web application.

Step 1: Setting up Flask

Begin by installing Flask using pip, Python's package installer. Open a terminal or command prompt and run the command:

pip install flask
Enter fullscreen mode Exit fullscreen mode

Next, create a Flask application. Create a new file (app.py), import Flask and define a Flask application instance:

from flask import Flask

app = Flask(__name__)
Enter fullscreen mode Exit fullscreen mode

Define the routes and start the development server:

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

if __name__ == '__main__':
    app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode

Finally, In the terminal or command prompt, execute the command:

python app.py
Enter fullscreen mode Exit fullscreen mode

Test the application: Open a web browser and visit http://localhost:5000/. You should see the "Hello, World!" message displayed.

Step 2: Configuring Nginx

Install Nginx on your server following the instructions relevant to your operating system.

Configure Nginx as a reverse proxy - Open the Nginx configuration file, typically located at /etc/nginx/nginx.conf, and add the following configuration block within the http context:

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
Enter fullscreen mode Exit fullscreen mode

Replace your_domain.com with your domain name or IP address.

Save the configuration file and exit the editor. Apply the configuration changes by restarting Nginx:

sudo service nginx restart
Enter fullscreen mode Exit fullscreen mode

With Nginx serving as a reverse proxy, you can access your Flask application by visiting your domain name or IP address in a web browser.

Summary

WSGI allows different web servers and web frameworks to seamlessly work together. By leveraging the simplicity of Flask and the performance of Nginx, we can build and deploy robust Python web applications. 🚀

Top comments (0)