In my current project I had a task to use twitter API. Twitter uses OAuth for authentication, which is pretty dreary. To avoid fiddling with it all the time, I've moved authentication to decorator, now it looks like this:
@twitter_api def tweet_hello(request, api): api.update_status('hello')
Decorator checks if key is available, and, if needed - initiates authentication. User is redirected to twitter, grants permission and is redirected back to site, to the same place where he left off. If key is available - nothing happens, just view is launched as usual.
It's convenient that there's no need for additional twitter settings in user profile.
tweepy is used as an API wrapper.
def twitter_api(view): def wrapped(request, args, *kwargs): callback_url = absolute_url(oauth_endpoint) auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, callback_url)
if 'twitter_access_token' in request.session: key, secret = request.session['twitter_access_token'] auth.set_access_token(key, secret) return view(request, api=tweepy.API(auth), *args, **kwargs) request.session['twitter_action'] = request.path redirect_url = auth.get_authorization_url() request.session['twitter_request_token'] = (auth.request_token.key, auth.request_token.secret) return redirect(redirect_url) return wrapped def oauth_endpoint(request): callback_url = absolute_url(oauth_endpoint) auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, callback_url) key, secret = request.session.pop('twitter_request_token') auth.set_request_token(key, secret) verifier = request.REQUEST.get('oauth_verifier') auth.get_access_token(verifier) request.session['twitter_access_token'] = (auth.access_token.key, auth.access_token.secret) return redirect(request.session.pop('twitter_action'))
absolute_urlshould return full url, with http://
request.pathyou can also store
SQL is a fairly complicated language with a steep learning curve. For a large number of people who make use of SQL, learning to apply it efficiently takes lots of trials and errors. Here are some tips on how you can make your SELECT queries better. The majority of tips should be applicable to any relational database management system, but the terminology and exact namings will be taken from PostgreSQL.
As you know, model managers can be overriden in Django. It's convenient to add custom filtration method there:Article.objects.published()Article.objects.old()But these custom methods cannot be chained:Article.objects.published().old()In this article I'll explain how this can be solved.
In this article I will describe how to integrate geolocation HTML5 function to a web app so you can then easily implement it in your apps or websites. As an example we are going to create small web app which will be able to calculate the shortest route between detected user’s location and predefined destination using Google Maps API.
When we use css-sprites it's important to make browser cache them for longest period possible. On other hand, we need to refresh them when they are updated. This is especially visible when all icons are stored in single sprite. When it's outdated - entire site becomes ugly. To solve this task I've implemented this small script that adds file's hash to url:background-image: url(images/icons.png?a3844c660);
It appears that not everyone knows that in python you can create classes dynamically without metaclasses. I'll show an example of how to do it.So we've learned how to use custom QuerySet to chain requests:Article.objects.old().public()Now we need to make it work for related objects:user.articles.old().public()This is done using use_for_related_fields, but it needs a little trick.