How to solve import errors while trying to deploy Flask using WSGI on Apache2

22,848

Solution 1

Thanks to zarf and damjan on irc.freenode.org at #pocoo, they were able to help me get this fixed. The problem was the PythonPath was not correct. We fixed this by using the following wsgi.py

import sys
sys.path.insert(0, "/sites/flaskfirst")

from app import app
application = app

Solution 2

I used your solution to get it working but it kept duplicating the path in sys.path (you can write it out to see if it happens to you) so I made a little modification:

import sys
flaskfirst = "/sites/flaskfirst"
if not flaskfirst in sys.path:
    sys.path.insert(0, flaskfirst)

from app import app
application = app

That way it's only included once

Share:
22,848
Shane Reustle
Author by

Shane Reustle

Updated on October 20, 2020

Comments

  • Shane Reustle
    Shane Reustle over 3 years

    I am having an issue deploying a flask app on apache2 using wsgi. I have posted the error logs and config files below. I have tried moving things around, renaming them, etc, but all give me an internal server error. Not sure why I'm getting the import error. Any input / suggestions are appreciated, thanks!

    Here is my apache error.log

    [Sun Sep 12 20:47:59 2010] [error] [client] mod_wsgi (pid=9753): Target WSGI script '/sites/flaskfirst/wsgi.py' cannot be loaded as Python module.
    [Sun Sep 12 20:47:59 2010] [error] [client] mod_wsgi (pid=9753): Exception occurred processing WSGI script '/sites/flaskfirst/wsgi.py'.
    [Sun Sep 12 20:47:59 2010] [error] [client] Traceback (most recent call last):
    [Sun Sep 12 20:47:59 2010] [error] [client]   File "/sites/flaskfirst/wsgi.py", line 1, in <module>
    [Sun Sep 12 20:47:59 2010] [error] [client]     from app import app as application
    [Sun Sep 12 20:47:59 2010] [error] [client] ImportError: No module named app
    

    wsgi.py

    # This is wsgi.py
    from app import app as application
    

    app.py

    # This is app.py
    from flask import Flask, render_template
    import settings
    
    app = Flask(__name__)
    app.debug = settings.DEBUG
    
    from views.homepage import *
    from views.events import *
    from views.submit import *
    from views.feed import *
    
    if __name__ == "__main__":
        app.run()
    

    Here is the basics of the directory tree, to give you an idea.

    /flaskfirst/
        /static/
        /templates/
        /views/
        __init__.py
        app.py
        wsgi.py
    

    Here is the apache virtualhost file

    <VirtualHost *:80>
            ServerAdmin [email protected]
            ServerName crath.org
            DocumentRoot /sites/flaskfirst
    
            # WSGI Settings
            WSGIScriptAlias / /sites/flaskfirst/wsgi.py
            WSGIDaemonProcess flaskfirst user=sreustle group=general processes=1 threads=10
            WSGIProcessGroup flaskfirst
    
            # Static Directories
            Alias /static /sites/flaskfirst/static/
            <Location "/static">
                    SetHandler None
            </Location>
    
    </VirtualHost>
    
  • chris
    chris almost 12 years
    Was having the same issue. I added it to WSGIDaemonProcess appName python-path=/home/... in my httpd config file. Not sure if that is the correct place or not, but FWIW is an option. More about WSGIDaemonProcess: [link] (code.google.com/p/modwsgi/wiki/…)
  • Roomm
    Roomm almost 8 years
    Thanks! You saved my day!!