Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Python 3 and Django with Apache?

My goal is to set up Python 3 with Apache. My biggest problem is actually acquiring mod_python.so. For the life of me I found only one site where it could be downloaded (http://www.modpython.org/) and what I got was a bunch of build and install files.

I can find no guide explaining how to set up Python 3 with Apache. So if someone could walk me through it now, the internet will finally contain the solution!

like image 663
Hubro Avatar asked May 08 '11 21:05

Hubro


5 Answers

Django 1.6+ and mod_wsgi 3.4+ are required to use Python 3 with Apache. For more detail refer to scot's answer.

like image 194
zeekay Avatar answered Oct 23 '22 01:10

zeekay


You can't unser python3 with django. From Django FAQ: http://docs.djangoproject.com/en/dev/faq/install/#can-i-use-django-with-python-3

Can I use Django with Python 3?

Not at the moment. Python 3.0 introduced a number of backwards-incompatible changes to the Python language, and although these changes are generally a good thing for Python’s future, it will be a while before most Python software catches up and is able to run on Python 3.0. For larger Python-based software like Django, the transition is expected to take at least a year or two (since it involves dropping support for older Python releases and so must be done gradually).

In the meantime, Python 2.x releases will be supported and provided with bug fixes and security updates by the Python development team, so continuing to use a Python 2.x release during the transition should not present any risk.

like image 33
Motiejus Jakštys Avatar answered Oct 23 '22 01:10

Motiejus Jakštys


These answers are no longer true of Django 1.6 - it supports python3. The mod_wsgi page says version 3.4 supports python 3. https://code.google.com/p/modwsgi/

Don't know if it all works at this point though (I will return and edit when I find out)!

The answer is YES it works!

I have an AWS EC3 Ubuntu instance running Python3, Django 1.5.6, Apache2.2 and mod_wsgi 3.4

Python 3.3.4:

sudo add-apt-repository ppa:fkrull/deadsnakes
sudo apt-get install python3.3
sudo apt-get install python3.3-dev python3.3-doc idle-python3.3

ppa:fkrull/deadsnakes is a apt repo has has multiple python versions available - see https://launchpad.net/~fkrull/+archive/deadsnakes

Then I added pip using the instructions at the pip page; http://pip.readthedocs.org/en/latest/installing.html. (remember your python is probably on your path as 'python3.3' at this point, plain 'python' will point at python 2.x!)

After that, virtualenv. Then I virtualenv'd the python installation. Upon activation and adding the environment's bin/ directory to the $PATH I've now got a clean python3.

Then, after I activated the virtual env, I did 'pip Django' and all my other necessary packages (which were quite a few). I have Django version 1.6.2 (I've been developing on this and running under python 3.3.3 on my Mac no problem).

The most trouble I had was installing lxml because it requires libxml2 and libxslt to be installed with apt-get (it is a wrapper around the C code) and it took me a couple of attempts to realise that they were not already installed (lxml compilation fails).

After tossing about getting my RDS database instance up and running and available (postgresql, beware mysql under python3, you'll get plenty of python db driver pain! but most of my issues were caused by me trying to understand the AWS security configuration), it was relatively plain sailing:

sudo apt-get install apache2 apache2-threaded-dev

That installs apache - and you need the dev packages for the next bit.

And that point, I tried using the apt package for mod_wsgi but I decided that the best thing to do was to compile and install it myself, following the instructions here - https://code.google.com/p/modwsgi/wiki/InstallationInstructions

I had no problems with configure, make, or make install. Make sure you compile it in your virtualenv activated environment.

You have to manually add the configuration to Apache's configuration:

# wsgi module
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
# now configure it
<Directory /my/app/path>
 <Files wsgi.py>
  Order deny,allow
  Allow from all
 </Files>
</Directory>
WSGIScriptAlias / /my/app/path/wsgi.py
WSGIPythonPath /my/app:/path/to/the/virtual/env/lib/python3.3/site-packages

And in the broadest possible way, this is all now working.

like image 39
scot Avatar answered Oct 23 '22 01:10

scot


1) The first thing we should do with our newly created project files is adjust the settings. Open the settings file with your text editor:

gedit myproject/settings.py

At the bottom of the file, we will add a line to configure this directory. Django uses the STATIC_ROOT setting to determine the directory where these files should go. We'll use a bit of Python to tell it to use a directory called "static" in our project's main directory:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

2) We can collect all of the static content into the directory location we configured by typing:

./manage.py collectstatic

You will have to confirm the operation. The static files will be placed in a directory called static within your project directory.

3)You need mod-wsgi adapter to configure Django in Apache install wsgi lib like below.

sudo apt-get install libapache2-mod-wsgi sudo a2enmod wsgi

4)At the bottom of file, /etc/apache2/sites-available/000-default.conf

WSGIPythonPath /var/www/html/myproject/ 
WSGIProcessGroup myproject
WSGIScriptAlias / /var/www/html/myproject/myproject/wsgi.py


  Alias /static /var/www/html/myproject/static/

<Directory /var/www/html/myproject/static>
    Require all granted
</Directory>

<Directory /var/www/html/myproject/myproject>
    <Files wsgi.py>
         Order deny,allow
        Require all granted
    </Files>
</Directory>

Alias /media/ /var/www/html/myproject/media/
<Directory /var/www/html/myproject/media>
Require all granted
</Directory> 
WSGIDaemonProcess myproject python-path=/var/www/html/myproject/

5)Restart the apache2 server:

sudo service apache2 restart

6)Now go to Localhost:

Bingo! You are all set for Django with apache.

like image 3
0cool Avatar answered Oct 23 '22 00:10

0cool


I faced a similar problem and here is how I solved it: To Install LAMP:

   sudo apt-get install lamp-server^
 // then do more from here:
   //https://help.ubuntu.com/community/ApacheMySQLPHP
 // If you will run python services then : 
       apt-get install python-mysqldb 
//and for python 3 install: 
   sudo apt-get install python3-pip python-dev build-essential
   pip3.4 install mysqlclient  // for mysql       connection 
   sudo apt-get install build-essential python-dev libmysqlclient-dev

   pip3 install virtualenvwrapper
   sudo nano ~/.bash_profile
  //Set location of virtualenvs by pasting this in above: 
   export WORKON_HOME=$HOME/.virtualenvs 
   source /usr/local/bin/virtualenvwrapper.sh
//Reload startup file:
  source ~/.bash_profile
   mkvirtualenv -p /usr/bin/python3 myprojectenv
   workon myprojectenv
//then you can install packages you want using pip
//and copy myproject here

To DEPLOY a Django 1.7 App on Ubuntu 14.04 LTS server with python3 and apache:

   sudo apt-get install libapache2-mod-wsgi-py3
 //then configure your apache virtualhosts( here our project is   //myproject    and environment is myprojectenv):

Configure your virtual host in Daemon mode which is recommended:

<VirtualHost *:80>
    ServerName yourdomain.com
    ServerAdmin [email protected]

    DocumentRoot /home/user/.virtualenvs/myprojectenv/public_html


    <Directory /home/user/.virtualenvs/myprojectenv/myproject/myproject>

     <Files wsgi.py>
     Require all granted
    </Files>
    </Directory>

    ErrorLog /home/user/.virtualenvs/myprojectenv/logs/error.log
    CustomLog /home/user/.virtualenvs/myprojectenv/logs/access.log  combined
    WSGIScriptAlias /  /home/user/.virtualenvs/myprojectenv/myproject/myproject/wsgi.py

    WSGIDaemonProcess myproject python- path=/home/user/.virtualenvs/myprojectenv/prisec:/home/user/.virtualenvs/m yprojectenv/lib/python3.4/site-packages

    WSGIProcessGroup myproject
    Alias /static /home/user/.virtualenvs/myprojectenv/public_html/static

    <Directory /home/user/.virtualenvs/myprojectenv/public_html/static>
     Require all granted
    </Directory>
     Alias /media
  /home/user/.virtualenvs/myprojectenv/public_html/media
       <Directory        /home/user/.virtualenvs/myprojectenv/public_html/media>
     Require all granted
    </Directory>

Restart Apache . the directories in virtualhost configuration file must exist in the virtual environment created.

like image 2
Morfat Mosoti Avatar answered Oct 22 '22 23:10

Morfat Mosoti