Don't address ports in URLs, the power of nginx is its reverse proxy capability.
First, create different config files for each web application, do not just smash everything in one server configuration - or even worse, in the nginx.conf file.
Set an upstream above your main server block for each application:
upstream webapp1 {
server 127.0.0.1:7000 weight=1 fail_timeout=0; #the timeout and weight settings are optional
}
Inside the server blocks, when nginx accesses the location "/", call the upstream:
server {
listen 443 ssl http2; #if you go with HTTPS - which you should
server_name webapp1.random-company.com;
[...]
location / {
[...]
proxy_pass http://webapp1;
}
Repeat for webapp2 accordingly:
upstream webapp2 {
server 127.0.0.1:8000;
}
server {
listen 443 ssl http2; #if you go with HTTPS - which you should
server_name webapp2.random-company.com;
[...]
location / {
[...]
proxy_pass http://webapp2;
}
Concerning the Django / Flask applications, you don't actually need to call the applications via TCP/IP, you could have nginx directly listen to their UNIX sockets. What do you use to deliver the application? uWSGI, Gunicorn, (...)?
Further reading for Flask on uWSGI
In general this is not necessarily an Ubuntu topic, perhaps you would want to check StackOverflow or Serverfault instead.