• Zeth will be attending PyCon UK on the 12th to 14th September 2008.

How not to program WSGI

12 May 2008

or how not to serve robots.txt with PyBlosxom

So as you may have noticed, I moved this site from PyBlosxom to Django, which depending on your perspective is a fabulous thing to do or is tantamount to treason on the high seas. I will explain more about that later.

Old links to the site should, in the main, still work hopefully as I have done some regular expressions jujitsu which should hopefully send everyone to where they were supposed to be going.

However, some posts and comments will have their formatting up the creek. So I want the old version of the site to be available (at archive.commandline.org.uk) for a while longer.

Because the archived version is deprecated and on the way out, I do not want the search engines to index it. Therefore I needed to make a robots.txt file for that subdomain excluding them from indexing it.

The last version of this site, like many dynamic sites, is composed of a number of layers, part of which was a lot of my own nonsense code doing various things. Ignoring that, when a request for a packet came in it would go to WSGI which would then pass the request on to PyBlosxom which was at the bottom of it all doing the hard work.

To deploy it properly, one would normally put Apache at the front as well, but I never got around to that. In theory this is a bad thing to do. But in practice it worked really well without the huge and complicated server that is Apache in the mix. It actually ran fine for a year without stopping, and blazing fast too; if it also confused a few comment spam bots then all the merrier.

So I tried putting Apache into the mix so I could use a Location directive to direct /robots.txt to somewhere with the robots.txt file, but no joy, this would have required doing a lot of what I never got around to before.

So I then looked into how the test server was deploying the site, thinking that I could do some kind of smart regular expressions type matching like in Django or Pylons. But nope.

Hack for the win

So the next step down is PyBlosxom, so I looked out of chance in Pyblosxom/pyblosxom.py and saw the following:

def __call__(self, env, start_response):
    """
    Runs the WSGI app.
    """
    # ensure that PATH_INFO exists. a few plugins break if this is
    # missing.
    if "PATH_INFO" not in env:
        env["PATH_INFO"] = ""

    p = PyBlosxom(self.config, env)
    p.run()

    pyresponse = p.getResponse()
    start_response(pyresponse.status, list(pyresponse.headers.items()))
    pyresponse.seek(0)
    return [pyresponse.read()]

Bingo! As soon as I saw it, I just somehow, on auto pilot, typed in the following lines before the line p = PyBlosxom(self.config, env):

if env["PATH_INFO"] == "/robots.txt":
    start_response('200 OK', [('Content-type','text/plain')])
    return ["""User-agent: * \nDisallow: /"""]

And unbelievably it worked. What I had subconsciously done was to see that we have some kind of string referred to by env["PATH_INFO"]. Then further on we have an object called start_response which is being passed a status and some headers. Then we are returning the response.

I was kidding around more than anything so I just replaced everything I didn't know about with reasonable looking constants (you will know these well if you have ever done Python CGI programming).

I am sure there are millions of far better ways to serve robots.txt with PyBlosxom. But this hack works for me until I no longer need the old site anymore.

1 John Reese says...

The new site looks good. Just thought I'd stop by long enough to say that. Cheers

Posted at 3:59 a.m. on May 13, 2008


2 Ryan says...

Yeah, good layout too. Very clear. :) Better than the last, in fact! I'm another python/django nerd, so I'll be listening even more now. I guess one of the things that's inspiring about Django is they're concerned pretty hardcore with security fixes. Just this week, an email came out and they released new sub-versions for each major Django release to include the fix. Very awesome.

For your blog post model, what did you do for entering posts? Do you still use the default admin interface, or did you make your own views for posting and whatnot? I haven't looked into it much, but does django automatically include much in the way of wysiwyg text editors for text fields?

Posted at 5:28 p.m. on May 15, 2008


3 dbr says...

I concur with the other two comments - this is one of the nicer blog'y site layouts I've seen. The comment system is also actually pleasant to use, unlike every single other one I've (not)-used \o/ One slight bug, you need to enter two backslashes to make it visible.

Anyway.. This hack seems an extremely convoluted and bad way to serve a simple text file, does it not? I've not used Pyblosxom, but it seems insane that it doesn't allow you to serve up static files (specifically /robots.txt and /favicon.ico)..?

As much as I now dislike PHP compared to Python, this does reaffirm my decision to stick with PHP for web-applications - no web-framework has gotten near the simplicity of shoving an index.php file in htdocs/

Posted at 2:53 p.m. on May 16, 2008


4 Zeth says...

Hi guys, thanks for your comments. I deal with them in more depth in a post that I will publish shortly.

However, one small thing; dbr, I really advice against inferring anything from this post. You are completely right that the hack is extremely convoluted and a crazy way to serve a text file.

It is crazy because of me, not because of the software, but because I am bulldog and I won't let go until it is dead!:

  • I want the old archive to be easily available to humans but not search engines.
  • I could not use any existing URLs, because the archive cannot interfere with every incoming link going to the right place on the new site.
  • The last website was deployed in a really experimental way that would need a lot of work to unravel.
  • I wanted to do as little work on the old version of the site as possible, yet have it available with no loss of data or formatting.

This blog has gone from Blogger to Wordpress to my owned hacked Pyblosxom to Django. No other formatted text has gone this way so it is not really something you can learn positive lessons from. Most other people would have used Apache so you get that to serve your robots file.

When moving from Wordpress to Pyblosxom, I made it easy on myself by using a Wordpress style of pseudo-HTML as my markup format in Pyblosxom.

If I had a time machine then I would have used something XML-compatible (such as ReStructuredText) instead.

I still like Pyblosxom, it is a really nice way to get a simple blog up, and I still prefer it to any other pre-made blog application.

But the way I want to develop the site going forward involves a bit more freedom, and for that I want a real web framework. Django is by far my favourite so it is natural that I use that.

Posted at 4:37 p.m. on May 16, 2008


What do you have to say?

Show Editing Help


PyCon UK

About

Hello, my name is Zeth, I'll be your host here.

Command Line Warriors is about taking control of your own technology, it looks at our experiences of computing; especially using GNU/Linux, the Python programming language, the command-line and issues such as techno-ethics, best practices and whatever is cool now. If you take control of your technology then you are a Warrior too!

This site is your site too which means that you can contribute and get involved. You can leave comments using the facility provided. For me, the comments and discussions are by far the best part of the site. So please do have your say!

Latest Discussions

Naib

August 27, 2008
And the greatest flaw with this "simple" talley? Women's eights final: 1 United States 6:05.34 Gold 2 Netherlands 6:07.22 Silver 3 Romania 6:07.25 Bronze Men's quadruple sculls final: 1 Poland ...
An Alternative Olympic Medal Table

james

August 27, 2008
Great discussion and a great "add-on" with the European countries! I still find medals per Capita very interesting because it indicates how many medals a country has won, from the ...
An Alternative Olympic Medal Table

Steve

August 27, 2008
Flawed logic. This comparison would only make sense if the EU could only send the same amount of competitors as a single country. Since it is treated as many small ...
An Alternative Olympic Medal Table

Zeth

August 27, 2008
Hi Benjamin, as far as I know, you can put any GSM SIM card into your OpenMoko, so you have the freedom to choose the best deal for you from ...
OpenMoko vs iPhone - Free your phone or Fight your phone?

Benjamin Melançon

August 25, 2008
Network question. I know more about computers than cell phones. Can anyone tell me or point me to a resource about what purchase options for network access are. For instance ...
OpenMoko vs iPhone - Free your phone or Fight your phone?

Mark (Cycom on freenode)

August 23, 2008
Two separate ideas here: First: Is not the competition between KDE and GNOME a good thing? It drives both to improve in a way that Mac and Windows and Linux ...
Is GUADEC just GDEC?

Zeth

August 21, 2008
Thanks for your comments guys, the newspapers need to sit a while on the naughty step until they are willing to play nicely. John Reese, thanks for visiting, it is ...
Newspapers please link to your sources

John

August 20, 2008
Zeth, The link to this file (for view wireless history) doesn't bring up a dialogue. Could you fix this?
Five Tips for Easter

John Reese

August 20, 2008
They're *carts*, not "trolleys"! ;)
Newspapers please link to your sources

akahn

August 20, 2008
Control-L usually selects the whole address, so only Control-L Control-C would be needed.
Newspapers please link to your sources

Sean

August 20, 2008
That was good. I'm crackin' up.
Newspapers please link to your sources

Garrick

August 20, 2008
Here here!
Newspapers please link to your sources

Seth Kriticos

August 19, 2008
bkil: "GTK and Gecko-tied extensions could be ported to non-gecko browsers." *cough* Epiphany is running on gecko currently and integrates some extensions thereof, they are just planning to switch to ...
Will Epiphany be able to compete with Firefox's extensions?

Harshad Modi

August 18, 2008
Thanks helping me!!! but I have problem on banner.... I try to make my own sftp server using paramiko inherit paramiko.ServerInterface class. but I got this error: ERROR:paramiko.transport:SSHException: Error reading ...
SFTP in Python: Paramiko