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
In VIM there is a command for char search: f. After first use it can be repeated with ;. I like to navigate in line with it. You see that you need to go to bracket in a middle of a line - you press f( and one-two ; and you are there. There's no such command in Emacs, so I had to write my own. I've managed even to implement repetition with ;.