Saturday, February 26, 2022

[SOLVED] Flask server running on EC2 Ubuntu cannot find the python packages

Issue

I am running a flask server using AWS EC2 with Apache. The issue is that the flask server doesn't recognize where the python package is.

Python packages are located at '/home/ubuntu/.local/lib/python3.8/site-packages/'

Below is the /var/www/html/flaskapp/flaskapp.py

    import numpy as np
        
    from flask import Flask, jsonify
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():

            return jsonify("Hello From Flask")
    
    @app.route('/countme/<input_str>')
    def count_me(input_str, methods = ['GET']):
            return jsonify(input_str)
    
    if __name__ == '__main__':
            app.run()

When I try to access to my server, I get this error

    ModuleNotFoundError: No module named 'numpy'

Below is 'flaskapp.wsgi'

    import sys
    import site
    
    sys.path.insert(0, '/var/www/html/flaskapp')
    
    from flaskapp import app as application

Below is '/etc/apache2/sites-enabled/000-default.conf'

    <VirtualHost *:80>
            # The ServerName directive sets the request scheme, hostname and port that
            # the server uses to identify itself. This is used when creating
            # redirection URLs. In the context of virtual hosts, the ServerName
            # specifies what hostname must appear in the request's Host: header to
            # match this virtual host. For the default virtual host (this file) this
            # value is not decisive as it is used as a last resort host regardless.
            # However, you must set it for any further virtual host explicitly.
            #ServerName www.example.com
    
            WSGIDaemonProcess flaskapp threads=5 python-path=/var/www/html/flaskapp/flaskapp
            WSGIScriptAlias / /var/www/html/flaskapp/flaskapp.wsgi
    
            <Directory flaskapp>
                    WSGIProcessGroup flaskapp
                    WSGIApplicationGroup %{GLOBAL}
                    Order deny,allow
                    Allow from all
            </Directory>
    
            # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
            # error, crit, alert, emerg.
            # It is also possible to configure the loglevel for particular
            # modules, e.g.
            #LogLevel info ssl:warn
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            # For most configuration files from conf-available/, which are
            # enabled or disabled at a global level, it is possible to
            # include a line for only one particular virtual host. For example the
            # following line enables the CGI configuration for this host only
            # after it has been globally disabled with "a2disconf".
            #Include conf-available/serve-cgi-bin.conf
    </VirtualHost>
    
    # vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Can anyone let me know what should I do for the flaskapp to find where the packages are?


Solution

You need to do the following:

  1. Install mod-wsgi for python3
sudo apt-get install libapache2-mod-wsgi-py3

This will replace libapache2-mod-wsgi and will restart the apache service.

  1. Add your python package path to the script located at /etc/apache2/sites-enabled/000-default.conf
WSGIPythonHome "/usr/local/bin"
WSGIPythonPath "/home/ubuntu/.local/lib/python3.8/site-packages"

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    WSGIDaemonProcess flaskapp threads=5 python-path=/var/www/html/flaskapp/flaskapp
    WSGIScriptAlias / /var/www/html/flaskapp/flaskapp.wsgi

    <Directory flaskapp>
            WSGIProcessGroup flaskapp
            WSGIApplicationGroup %{GLOBAL}
            Order deny,allow
            Allow from all
    </Directory>

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>


Answered By - Jeril
Answer Checked By - Cary Denson (WPSolving Admin)