So I'm trying to write a simple wsgi python module where I use __init__.py to bring in variables & functions from another file but I can't seem to get the module to load. I keep getting the "AttributeError"
I've tried fiddling with some variations of "from . import mydb" and "from . import *" but haven't had any luck.
The code isn't anything complicated, see below. A wsgi loads a simple Flask app and then tries to load a module and access a single variable in the module, but I can't seem to get it to work. I feel like I'm missing something blindingly obvious...
Edit: As user2357112 correctly pointed out I'm trying to run a sub package from my app directory (/var/www/html/hellopy/app/config/). I wrote out the paths but managed to get them wrong.
Still fiddling with it trying to figure it out...
/var/www/html/hellopy/hellopy.wsgi:
import sys
import logging
from hellopy import app as application
from app import config
mydbkey = config.dbkey
# Optional: Set logging
logging.basicConfig(stream=sys.stderr)
sys.stderr = sys.stdout
/var/www/html/hellopy/hellopy.py:
import sys
from flask import Flask
sys.path.insert(0, '/var/www/html/hellopy')
app = Flask(__name__)
#to restart apache, sudo systemctl restart httpd.service
@app.route('/')
def hello_world():
return 'Hello, World! Py found! Updated right now!, '
if __name__ == "__main__":
application.run()
/var/www/html/hellopy/app/config/init.py
__all__ = ["mydb"]
/var/www/html/hellopy/app/config/mydb.py
dbkey = "abc123"
The error:
[Thu Mar 13 17:15:47.192392 2025] [wsgi:error] [pid 5735:tid 5841] [remote 127.0.0.1:37416] mod_wsgi (pid=5735): Failed to exec Python script file '/var/www/html/hellopy/hellopy.wsgi'. [Thu Mar 13 17:15:47.192441 2025] [wsgi:error] [pid 5735:tid 5841] [remote 127.0.0.1:37416] mod_wsgi (pid=5735): Exception occurred processing WSGI script '/var/www/html/hellopy/hellopy.wsgi'. [Thu Mar 13 17:15:47.192611 2025] [wsgi:error] [pid 5735:tid 5841] [remote 127.0.0.1:37416] Traceback (most recent call last): [Thu Mar 13 17:15:47.192706 2025] [wsgi:error] [pid 5735:tid 5841] [remote 127.0.0.1:37416] File "/var/www/html/hellopy/hellopy.wsgi", line 8, in [Thu Mar 13 17:15:47.192726 2025] [wsgi:error] [pid 5735:tid 5841] [remote 127.0.0.1:37416] mydbkey = config.dbkey [Thu Mar 13 17:15:47.192732 2025] [wsgi:error] [pid 5735:tid 5841] [remote 127.0.0.1:37416] ^^^^^^^^^^^^ [Thu Mar 13 17:15:47.192747 2025] [wsgi:error] [pid 5735:tid 5841] [remote 127.0.0.1:37416] AttributeError: module 'app.config' has no attribute 'dbkey'
EDIT2:
Thanks to user2357112 I figured out this works:
Edit to /var/www/html/hellopy/hellopy.py:
#!/var/www/html/hellowpy/venv/bin/python
import sys
import logging
logger = logging.getLogger(__name__)
from hellopy import app as application
from app import config
mydbkey = config.mydb.dbkey
# Optional: Set logging
logging.basicConfig(stream=sys.stderr)
sys.stderr = sys.stdout
logger.error("Logged message from hellopy " + mydbkey)
Edit to /var/www/html/hellopy/app/config/init.py:
# -*- coding: utf-8 -*-
from . import mydb
__all__ = ["mydb"]
But it's not quite what I wanted. I wanted the dbkey object to be part of config object without having to dump it all into the init.py file.
I know that's the "right" way to do it, that I shouldn't just put a ton of stuff in init.py but I haven't quite figured out how to do it :)
Definitely getting closer :)
appinfrom hellopy import app as applicationandfrom app import configto be the sameapp? That's not how Python imports work.