.. post:: 2008-11-09 11:49:43
The times, they are a changin
=============================
A couple posts back, I was talking about software that I use all
the time. I was going through and linking to all of the software. I
would go to google, type in the project name, go to the first
result, and copy that URL back into my post. I figured that there
had to be a better way. Any software project worth it's name owns
the top result in google.
The web is a dynamic place, and websites move, change, and
disappear all the time. The popularity and importance of some
things change over time as well. So I was thinking about how to go
about linking to the most popular thing for a search. It also
happened to be useful for my last post and linking to things. A
similar approach could be used with Wikipedia. Creating something
that just linked to somethings wikipedia page.
Show me the code.
~~~~~~~~~~~~~~~~~
I couldn't use Google, because I couldn't find a good web search
API for them. Yahoo however has a
`really nice one `_ that is out
there to use. This, combined with James Bennett's awesomely useful
`template utils `_
allowed me to whip this up in about 10 minutes. Here's the code
below.
::
from template_utils.nodes import ContextUpdatingNode
from yahoo.search.web import WebSearch
class SearchNode(ContextUpdatingNode):
def __init__(self, search):
self.search = search
def get_content(self, context):
srch = WebSearch('EricSearch', query=self.search)
res = srch.parse_results()
return {'top_url': res.results[0].Url}
@register.tag
def first_yahoo_link(parser, token):
return SearchNode(token.split_contents()[1])
Easy as pie, and awesome. This ties into my previous post about
template tags being hard to write. If you just want to make a
template tag that sets a context, it's as easy as making a node and
returning a dictionary in the ``get_content()`` function. This
isn't a super robust solution, but now i can do
``{% first_yahoo_link "search terms" %}`` and ``{{ top_url }}``
will contain the Url of it!
Also note how easy it is to use Yahoo's search api! That's awesome.
If this was on a more highly trafficked site, you would want to
cache the results (maybe daily, because they shouldn't change
much). I may go ahead and do a tutorial on how to do caching with
template tags and template-utils if people are interested in it.
The observant will note that this doesn't help me writing a blog
post, because there's no way to call a template tag from within.
That might be something for me to cook up later this month. The
template tag is still neat however, for introducing yahoo's web
api, and template-utils.