I have used mod_wsgi-express to whump up an Apache config. But I found a 
problem whereby when run by user "apache" it can't find a python module 
which I know is present when running under "root" :

# *whoami*
root

# *python -c "import django;"*
#

# *su apache*

$ *python -c "import django;"*
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'django'

I recall reading that mod_wsgi and mod_wsgi-express is installed with 
python running in some virtual environment. But as I am running this in a 
Docker container, I am really not interested in and know little about 
outdated old stuff like venv, virtualenv, and suchlike (and I wish there 
was a mod_wsgi-express option to use the system-wide python, and not bother 
with spinning a virtual cocoon round the python it uses, as doing this 
simply complicates things when using Docker! )

So my question is how can I "devirtualise" this python that runs under user 
"apache", so it runs the system-wide python3 and its libraries, and thus 
pick up the django module among others, the same as "root"?

Thanks in anticipation

Regards

John R Ramsden

P.S. The annoying thing is I had the perishing thing working on Friday, and 
carefully preserved my changes, or thought I had. But upon rebuilding the 
Docker container, something is not quite the same as before and the Apache 
error log has reverted to containing the "Not found 'django'" error as 
above. I'd be happy to set the access right to every file in the container 
to 777 if that is what it takes, as this app will be running inside an 
intranet. But I have a feeling that won't fix the problem, and probably 
isn't entirely sound from a security standpoint.

P.S. As a service to this mailing list, which I hope others may find 
useful, I append a python script I wrote to strip out all the extra "ifs 
and buts" cruft from the generated httpd.conf file, so one can see more 
clearly what is going on. (IMHO it would be a good idea to have a 
mod_wsgi-express option that generates the httpd.conf file without them to 
start with.) The script may not win any prizes for elegance, but it did the 
job for me. (But use it with care, as some version numbers are hard-coded! )

#!/usr/bin/python

import re

env_vars = dict()

#  Fetch '-D' tokens from httpd command arguments
#
#    HTTPD_ARGS="-f /application/apache/httpd.conf -E 
/application/apache/startup.log -DMOD_WSGI_VIRTUAL_HOST 
-DMOD_WSGI_WITH_HTTPS .."
#
funit = open('apachectl', 'r')

lines = funit.read().splitlines()

httpd_args = 'HTTPD_ARGS='

for line in lines:

    if len(httpd_args) < len(line) and httpd_args == 
line[0:len(httpd_args)]:

        matches = re.finditer(' -D[A-Z_]+', line)

        for match in matches:
            env_vars[match.group()[3:]] = 1

        break

funit.close()


#  Output httpd.conf file with Ifs and Buts removed
#
n_blank_line = 0

old_version = False

skip_level = 0

skip_flags = []

defined_no  = '<IfDefine !'
defined_yes = '<IfDefine ' 

funit = open('httpd.conf', 'r')

lines = funit.read().splitlines()

for line in lines:

    skip = None

    if '<IfVersion >= 2.2.15>' == line or '<IfVersion >= 2.4>' == line:
        continue

    elif '<IfVersion < 2.4>' == line:
        old_version = True
        continue

    elif '</IfVersion>' == line: 
        if old_version:
            old_version = False

        continue

    elif old_version:
        continue

    elif '</IfDefine>' == line:

       skip = skip_flags.pop()

       if skip:

           skip_level -= 1

       continue

    elif defined_no == line[0:len(defined_no)]:

       key = line[len(defined_no) : -1]

       skip = True if key in env_vars else False

    elif defined_yes == line[0:len(defined_yes)]:

       key = line[len(defined_yes) : -1]

       skip = True if key not in env_vars else False

    if skip is not None:

       skip_flags.append(skip)

       if skip:
           skip_level += 1

       continue

    if skip_level == 0:

        # Compress multiple output blank lines to single blank line
        #
        if re.match(r'^\s*$', line):
            n_blank_line += 1
        else:
            n_blank_line = 0

        if n_blank_line > 1:
            continue

        print(line)

funit.close()

-- 
You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/modwsgi/92ed75db-0c73-462f-8eee-f1e563b42d3f%40googlegroups.com.

Reply via email to