Just notes on what I’m up to in trying to get django to work for my Computer Science 462 class. I find this helpful for remembering where I left off and commands etc. But you will probably find it very boring unless you try and do the same.
using tutorial at http://docs.djangoproject.com/en/dev/intro/tutorial01/
==========================
Found I needed root priviledges, so I allowed the default users, ‘ubuntu’ root priledges by calling
so I logged into bash as root by just typing
|sudo bash
then editing the /etc/sudoers file by typing
|visudo
and adding changing the line from
root ALL=(ALL) ALL
to
ubuntu,root ALL=(ALL) ALL
===========================
I edited the settings file settings.py, and configured stuff for sqlite3, like the tutorial suggested.
then, as it suggested, ran
python manage.py syncdb
which created the database file where I wanted it in /var/django/db/mikeServ.db
—————————
tried to view the schemas by typing
|.schema
with no luck. googled how to view schemas in sqlite.
Googled what the matter might have been, found I needed pysqlite2, so ran
|aptitude search pysqlite2
found it, and ran
|apt-get install python-pysqlite2
but still can’t find anywhere how to use it really, nor what comes with that package
bah. I’ll just assume it worked for now, even thought I can’t check it. we shall see.
—————————
I want to use django for a class project which really doesn’t require a local database, just using ajax and templates, so I skipped over the rest of the first page of teh tutorial having to do with creating objects/tables, but it seeemd good.
—————————-
was interested in the admin pages to work, so I followed the instructions on teh next page:
added django.contrib.admin to INSTALLED_APPS in settings.py,
and ran
|python manage.py syncdb
then edited urls.py as indicated.
—————————–
Tried to run the /admin/ pages, but no go. I think I might need to restart the webserver:
|/etc/init.d/apache2 restart
When I visited my site (http://50.16.162.246/admin/) the next time, made some progress: got an error message! somethign about indentatino error in ursl.py, so I’ll go fix taht. (Found the compy was right: forgot to remove preceding white-space when uncommenting).
Now though, I’m getting a 500 error with no real helpful input. Hmm. progress? probably. I bet the error is coming from not reaaally having the database schemas, though I ran syncdb ‘n all. I should verify those exist for reals.
I foudn the problem was I don’t have django stuff on my path, as explained in http://martinjansen.com/2008/10/20/django-settings-files-for-development-and-production/. I just need to add my settings.py file to the PATH, and some DJANGO_SETTINGS.
Trouble with that, some help also on http://ubuntuforums.org/showthread.php?t=125735
Found that didn’t permanently solve anything. (This forum page has a good explanation of different config files like .bashrc and .bashprofile and stuff: http://ubuntuforums.org/showthread.php?t=125735).
Eventually, found an easy way to add to the PYTHONPATH is just to add a file named whatever.pth to something that already is on a the pythonpath (like /usr/local/lib/python2.6/dist-packages) and in that file write nothing but the path to whatever I want to add to the python path.
Still the DJANGO_SETTINGS_MODULE isn’t found.
Then I realized I had edited the wrong .bashrc file. I edited /.bashrc, when really I should ahve edited ~/.bashrc. bah!
So edited taht file instead, restarted teh command-prompt shell, and voila!
I could verify that PYTHONPATH was set by typing in
|$PYTHONPATH
into the shell and it would print it out
However, I’m still getting a 500 error on teh admin pages.
Added a symbolic link to the admin media stuff like suggested on http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/, but that didn’t resolve it.
Now I’m looking at http://code.djangoproject.com/wiki/django_apache_and_mod_wsgi
Ok, more of the same. But I’m onto something now.
I thought I really needed to see some better error logs. So I searched for where are the apache error logs, and found it’s at:
/var/log/apache2/error.log, right next to the access.log (I didn’t know they were seperate). I then noticed what the error seems to be:
[Sat Jan 29 16:25:55 2011] [error] [client 67.166.99.183] OperationalError: attempt to write a readonly database
meaning the sqlite file that its trying to write to is set to be read-only. Which kinda makes sense. So I’m gonna check what the files permissions are, and change them to amke them write-whatever-you-want. (Did that by going to the file, which I placed in /var/django/db/mikeServ.db and did the command chmod 777 mikeServ.db)
and BOOM BABY! Admin console!
Except I didn’t create the symbolic link to the media files right.
And then I noticed it stillw asn’t redirecting quite right. So I needed to edit the apache config file some more. Basically, I needed to make apache get the media files from where they’re at on the server. So I added these lines to my /etc/apache2/sites-available/default file:
Alias /media/ /usr/lib/pymodules/python2.6/django/contrib/admin/media/
Order deny,allow
Options Indexes
Options FollowSymLinks
Allow from all
==================================
ok so now I’m trying to get some pages to work,
I ran
|python manage.py startapp view
|” ” ” list
|” ” ” home
to create 3 ‘apps’ I guess that will host my files
and added those 3 things to my list of installed apps
and another issue is I’m not sure if django-admin.py is on my filepath. …actually immediately remembered: it is, just under a different name, it’s under django-admin (no ‘.py’)
————————————————-
so I finished those views.py files, as follows:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# Create your views here.
from django.http import HttpResponse
from django.template import Context, loader, Template
import urllib2
import json
def popular(req):
t = loader.get_template(‘popular.tmpl’)
return HttpResponse(t.render({}))
def recent(req):
t = loader.get_template(‘recent.tmpl’)
response=urllib2.urlopen(‘http://imaj-app.lddi.org:8010/list/recent’)
dictResponse=json.loads(response.read())
c = Context({‘imagelist’: dictResponse[‘images’],’nextsubmitdate’:dictResponse[‘nextsubmitdate’],’nextratesort’:dictResponse[‘nextratesort’]})
return HttpResponse(t.render(c))
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
and then the template:
<<<<<<<<<<<<<<<<<<<<<<<,
.listitem {
margin-bottom: 2em;
}
.listitem a {
float:left;
margin-right: 2em;
}
Recent Images
{% for image in imagelist %}
{% endfor %}
{% if nextsubmitdate %}
More Images …
{% endif %}
>>>>>>>>>>>>>>>>>>>>>
the ta gave the template to us originally in some ‘cheetah’ python template language, but converting it to django’s template language was easy: the semantics (the way it works) are just the same, just silly difference in syntax.
and voila! I have a page which renders! bwahahaha!
———————————-
I noticed the page was missing headers, css stuff, etc.
After inspecting the templates, I realized they had no declaration of etc, or importing of css files. Reason: I wasn’t using the main template at all!
Apparently Cheetah works differently from django’s template. In Cheetah the parent template imports the others by just inserting $main somewhere in teh html. IN django, you need a tag in the parent saying
{% block WHATEVER %}{%endblock%} and in the child template, you need to start with {
%extends ‘WHATEVERYOUCALLEDTHEPARENT.tmpl’%}
and then
{%block WHATEVER%} {%endblock%} (note that the names must match)
And then when it loads the child template, it’ll look for teh parent, load it, and insert the child template where indicated.
————————————-
About that css stuff. Sure enough, it wasn’t finding the css.
I read somewhere about how you can serve static files simply using apache. That makes sense, but I think somehow my django config was interfering with the usual serving of static files from my directory of /var/www.
So, I poked around and noticed that I could just add
(r’^site_media/(?P.*)$’, ‘django.views.static.serve’,{‘document_root’: ‘./site_media’,’show_indexes’: True}),
to my list of urlpatterns in urls.py. But it wasn’t working.
After a bit, i noticed the reason: ‘./site_media’ was meant to point to where the static files folder was located on the hard drive. I suppose it’s meant to be a relative uri, but it wasn’t working. Switched it to a absolute uri and it worked.
————————————–
Starting making another page which was basically identical to my first one
(which just sends out a request and then parses it into a json object and displays it) and got a goofy error saying something about how the dict module had no function named ‘push’. Really random. I saw it before htough. And I had the advantage of this page being basically the exact same as the previous one. So I compared them: identical. Then I remembered: sometimes you need to restart apache for the python to get reloaded. So restarted apache and it worked.
————————————-
wanted to be able to log stuff on my server.
SO, I followed the instructions on http://djangosnippets.org/snippets/1731/,
and added ‘site_logging’ to my list of installed apps, and added the site_logging.py file in the root of my django/mikeServ directory. Then called logging as instructed (even though I would have thought I should have been calling ‘site_logging’, but just ‘logging’ did it.)
Viewed the error log using
|tail -f /var/log/apache2/error.log
BOOM BABAY!
——————————–