Building a Python Web App with Flask and Nginx
Tags: python, wsgi, flask, ngnix
Published: 2023-05-27 19:33:03

---
title: Building a Python Web App with Flask and Nginx
published: true
description: Building a Python Web App with Flask and Nginx - Web Frameworks vs Web Servers and the role of WSGI
tags: python, WSGI, Flask, Ngnix
---

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
```

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

```python
from flask import Flask

app = Flask(__name__)
```

Define the routes and start the development server:

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

if __name__ == '__main__':
    app.run(debug=True)
```

Finally, In the terminal or command prompt, execute the command: 
```
python app.py
```

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;
    }
}
```
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
```

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. 🚀