Django tutorial on remote server: how to view in my browser? - django

I'm getting started with a Django tutorial, and I've run into a snag. Having created the sample "mysite" on my usual domain, I want to be able to display it in my browser. The tutorial points me to http://127.0.0.1:8000. However, that's not going to work, as I'm doing this remotely.
[background information]
What I have done, apparently successfully, is
django-admin.py startproject mysite
(created mysite directory containing four files)
python manage.py runserver
(Validating models... 0 errors found, etc.)
The absolute path is
/home/toewsweb/public_html/pythonlab/mysite
What URL should I be able to use to bring this up in my browser?
I also put mysite at
/home/toewsweb/mysite (since it's not supposed to go in a publicly accessible directory)
What URL should I be able to use in this case?
This is a virtual private server, so I have access to httpd.conf. I have downloaded and installed mod_wsgi and have added it to the Apache configuration. I actually did set a subdomain with a DocumentRoot of /home/toewsweb/public_html/pythonlab/mysite; however, when I point the browser to that subdomain, I just get the directory listing.
[/background information]
Right now, I just want to know how to view what I'm working on in my browser.
Thanks!

For development purposes, there's no need to mess about with configuring WSGI (although it's useful to know, as you will need to do it for production). Just start the dev server so that it listens to an external port:
./manage.py runserver 0:8000
This binds to the external IP address, so now you can access your Django site via port 8000 on that server:
http://whatever.my.ip.is:8000

You need to setup the apache WSGIScriptAlias directive in your VirtualHost to properly load python and your site. Django's docs have a great explanation on what you need to do.
Basic configuration
Once you’ve got mod_wsgi installed and activated, edit your httpd.conf file and add:
WSGIScriptAlias / /path/to/mysite/apache/django.wsgi
The first bit above is the url you want to be serving your application at (/ indicates the root url), and the second is the location of a "WSGI file" -- see below -- on your system, usually inside of your project. This tells Apache to serve any request below the given URL using the WSGI application defined by that file.
Next we'll need to actually create this WSGI application, so create the file mentioned in the second part of WSGIScriptAlias and add:
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
If your project is not on your PYTHONPATH by default you can add:
path = '/path/to/mysite'
if path not in sys.path:
sys.path.append(path)
just below the import sys line to place your project on the path. Remember to replace 'mysite.settings' with your correct settings file, and '/path/to/mysite' with your own project's location.
OR
The other option is to run the dev server so it's accesible externally like so:
python manage.py runserver 0.0.0.0:80
though please DO NOT use this in production. The dev server is single-threaded, and has not been auditing for security.

Related

Run Django project using wsgi

Hi i am trying to host the django site using WSGI app.My project resides in /opt/labs and the contents of this are django/ labs_site/ content/ home/
labs_site was the initial project that was derived from startproject and from labs_site/urls.py i link to content,home and other modules
i have followed the documentation in https://docs.djangoproject.com/en/1.4/howto/deployment/wsgi/ till renaming labs_site/wsgi.py as os.environ.setdefault("DJANGO_SETTINGS_MODULE", "labs_site.settings")
So after this what is the next step that i should follow.I want to run the project without the runserver
modify your apache settings now. If setting up wsgi file was your first step, then next step should be modifying your apachee config to point towards that file.
The link you posted points towards this page: https://docs.djangoproject.com/en/1.4/howto/deployment/wsgi/modwsgi/
that has all the necessary information. You can just choose between putting all that into http.conf file or creating site file for it under sites-available & sites-enabled folders in /etc/apache.
After that - restart your apache server by /etc/init.d/apache2 or service apache2 restart - whichever works.
Then since its your first time, youll see some errors in your /var/log/apache2/error.log. Fix them... and try again :)
Good luck.

WSGI loads settings of the wrong project: how to debug?

I have two django based web applications on the same server.
One of them i'll call CORRECT_PROJECT and the other one WRONG_PROJECT
The last one, CORRECT_PROJECT, is installed using a virtual environment and uses a different version of django (1.4). There's a very strange problem: sometimes, usually after a log out or an email confirmation (but sometimes looks just random!), the server returns a 500 internal server error and the error log says
"Could not import settings 'WRONG_PROJECT.settings' (Is it on sys.path?): No module name WRONG_PROJECT.settings, refer: CORRECT_PROJECT/URL"
That is, by loading CORRECT_PROJECT, sometimes the system (WSGI? Apache? Django?) tries to load the settings from WRONG_PROJECT.
By hitting refresh aggressively the error disappears.
What could be wrong? How can I debug?
CORRECT_PROJECT uses WSGI in deamon mode.
Solution
Use deamon mode: http://modwsgi.readthedocs.org/en/latest/configuration-directives/WSGIDaemonProcess.html
You are using wsgi.py from Django 1.4. That will not work when hosting multiple web apps in the same process.
Best solution is to use daemon mode and delegate each to a distinct daemon process group.
If can't do that, change the wsgi.py files of both so they do not use:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
but instead use:
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
Change mysite.settings as necessary.

Deploying a Django App

I'm very sorry for such a simple question-- I'm new at WSGI development, and I'm grateful for any patience you can afford.
I made a Django app; it works great in development mode. I run:
python manage.py runserver
and then direct my browser to 127.0.0.1:8000, and voila, there is my app.
From here I absolutely cannot figure out how to run my app in production mode. I've read several pages like this and this and several others on StackOverflow. But I have no idea of where to even direct my browser to see if my page is working.
I've installed apache2, mod_python, etc., but I think the problem is that my misunderstanding is at such a more basic level. When I've done CGI programs in the past, I direct my browser to webroot/file.html with a form that calls cgi-bin/file.cgi, which generates html output. I don't know if I am supposed to navigate to a .wsgi page, etc.
Under the assumption that I'm supposed to navigate to a .wsgi file, I've also tried making a file containing:
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
path = '/home/orserang/nonparametric-protein/src/www/mysite$'
if path not in sys.path:
sys.path.append(path)
and added
WSGIScriptAlias / /path/to/mysite/apache/django.wsgi
to my apache2/httpd.conf file, so that its contents are:
<Location "/mysite/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonOption django.root /mysite
PythonDebug On
PythonPath "['/home/orserang/nonparametric-protein/src/www/mysite'] + ['/home/orserang/nonparametric-protein/src/'] + sys.path"
WSGIScriptAlias /mysite /home/orserang/nonparametric-protein/src/www/mysite/django.wsgi
</Location>
But when I restart apache, it says:
Syntax error on line 8 of /etc/apache2/httpd.conf:
WSGIScriptAlias not allowed here
Given that I don't even know where I should point my browser to get to a Django wsgi page, I figured there is something easy that I'm doing quite wrong.
Perhaps Django WSGI apps require something to run in the background, which will listen for requests (rather than go through apache)?
The online Django documentation on views and databases alone are substantial compared to the documentation for deployment; therefore, my best guess is that this is such a simple thing to do.
Thanks a lot for your help!
The Django Book 2.0 has an overview about this. It's not typically linked to in the Django docs:
Chapter 12: Deploying Django
Look at the "Using Django with Apache and mod_python" section.
You're mixing up mod_python and mod_wsgi deployment methods. Get rid of everything inside the Location directive except for the WSGIScriptAlias line.
I wrote shell script that deploys a django project on apache for linux,
https://github.com/mukulu/shell-scripts/blob/master/deploy-django.sh
You only need to configure couple of variables in first lines of the code,
and it'll figure out the rest.
It pretty much checks and install dependencies for django, writes apache configurations that deploys your project and restart the server.
I'm planning to re-write it in python(I wrote it in a hurry)
Feel free to re-use.
Variables are:
SITE_PREFIX="/djangoproject"
MEDIA_URL="/media"
ADMIN_MEDIA_PREFIX="/static/admin/"
MEDIA_ROOT=""
DJANGO_VERSION="1.3.1"
APACHE2_CONFIG="/etc/apache2/conf.d" #Apache configurations directory in yoru system.
This might be not for a novice, but you can take a look - http://packages.python.org/django-fab-deploy/
It's the library for automating the deploying process. It supports servers based primarily on Debian Lenny or Squeeze.

Django Import errors on production environment

i have a trouble with run django project on production server with Apache and mod_wsgi. This Error happened when i'm start apache and go to site first time or go from other:
ImportError at /
Exception Value: cannot import name MyName
Exception Location /var/www/projectname/appname/somemodule.py
When i'm reload page the error disappears and site work fine. Another point is that this error happened selectively and sometime not appear.
In project i'm use imports without project name prefix (i mean 'from accounts.models import Account' instead 'from projectname.accounts.models import Account').
On development (manage.py runserver) server all work fine without any troubles.
I have used many variations of my apache and wsgi script configurations but problem is not solved.
Here my current projectname.wsgi:
#!/usr/bin/env python
import os, sys, re
sys.path.append('/var/www/projectname')
sys.path.append('/var/www')
os.environ['PYTHON_EGG_CACHE'] = '/var/www/projectname/.python-egg'
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Here is some parts from apache config:
<VirtualHost ip:80>
ServerAdmin admin#server.com
DocumentRoot /var/www
ServerName www.projectname.com
WSGIScriptAlias / "/var/www/projectname/projectname.wsgi"
WSGIDaemonProcess projectname threads=5 maximum-requests=5000
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
....
Also i'm use a separate Virtual Host for SSL.
I hope somebody help me.
Thanks!
When I had this problem, this post https://stackoverflow.com/a/10601523/1782780 pointed me towards the answer: I had a bug in a module further up the chain.
As Michal explains in that post:
Python does not just select that one class from the administrative/models.py file. Instead the Python interpreter reads the entire file, creates the module object, executes the code from the imported file in the new modules namespace, and then copies the name Contract from the new module's namespace to the current namespace. So, although it seems that you are importing just one class from a module, an error anywhere in that module can prevent a successful import - in your case it is an error with class ContractForm. The rest of the traceback details what exactly went wrong with that class.
So look further back in your traceback and you might find your problem.
I add a similar problem and the cause was that the 'current directory' was 'www' and not root project dir.
In the django development server the server environment is set according to the current project you are working. Thats why the import errors occur while shifting to Apache.
While using import use " from projectname.appname.models import MyModel ". Be as specefic as you can.
Use sys.path.append('location/to/your_project_foler/') in your case "/var/www"
Just a suggestion:
Also try to set-up django in another url than root. I also had a similar problem while trying to run django on the site root, i.e. :
WSGIScriptAlias /< some url > "/var/www/projectname/projectname.wsgi"
In my case it was a leftover directory from the past (filled with only the pyc compiled files which possibly caused the directory to stuck without deletion) which matched a new python file's name.
In the past a directory tasks was created in a module acme. Within that directory there was the __init__.py and four other python files.
The uwsgi service compiled the the pyc file for each of those python files once a request touched them.
Much later the files in that directory and the directory was removed from the Git source.
However because the .pyc files were in place the directory actually stayed on the server. (The git pull is incremental, we don't pull a complete source from ground zero).
Even more later (recently, now) I committed a tasks.py to that folder where there's this leftover tasks directory.
That made the uwsgi engine not being able to import anything from that file without any detailed reason.
The struggle to realize this took me more than half of my work day.

Works using Django development server, but throws import error with Apache using mod_wsgi

I have a Django project that works fine with the development server that comes with it.
No errors are produced at all when I use "django manage.py runserver" and the app works fine, but when I try to use it with mod_wsgi and Apache the browser displays "Internal Server Error" with a 500 error code and it generates an import error in the Apache error log.
Here's the error in the log:
ImportError: No module named registration
I'm using the Django registration module which is located in a path like this:
/opt/raj/photos/registration
I know that the registration app is in the path because I can fire up a Python shell, import sys, and get a list of paths using sys.path.
Here are some of the paths output from Python shell:
sys.path
['', '/opt/raj/pyamf', '/opt/raj', '/opt/raj/pictures', '/opt/raj/pictures /registration', '/usr/lib/python2.6',....]
Any thoughts would be appreciated.
Is it in the pythonpath for the webserver? All those '/opt' paths are typically not in the standard python path, so something is adding those for you I would guess. Are you sure it also gets added for the webserver process, or is PYTHONPATH set in some shell configfile somewhere for your user only?
There is a PythonPath directive when using mod_python, is there something similar for mod_wsgi?
This is almost certainly a case of the path not being the same for the webserver as it is for you, so I would focus my search in those areas.