Merge pull request #2 from zandeez/master
Modular Changes, general fixes (courtesy of zandeez)
This commit is contained in:
commit
e68d0a02f5
5 changed files with 83 additions and 36 deletions
|
|
@ -34,20 +34,29 @@ Twython also requires the (most excellent) OAuth2 library for handling OAuth tok
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
-----------------------------------------------------------------------------------------------------
|
-----------------------------------------------------------------------------------------------------
|
||||||
Copy the "twython_django_oauth" app into your project, and add it to your "INSTALLED_APPS" in your
|
|
||||||
settings.py file. If you wish to use the example template, feel free to copy that over as well.
|
pip install git+http://github.com/zandeez/twython-django.git
|
||||||
|
|
||||||
|
Add "twython_django_oauth" to your "INSTALLED_APPS" in your settings.py file. If you wish to use the example
|
||||||
|
template, feel free to copy that over as well.
|
||||||
|
|
||||||
After you've done that, specify the following urlconf in your root urls.py:
|
After you've done that, specify the following urlconf in your root urls.py:
|
||||||
|
|
||||||
(r'^your_url_extension/', include('your_app.twython_django_oauth.urls')),
|
(r'^your_url_extension/', include('twython_django_oauth.urls')),
|
||||||
|
|
||||||
If you're using this app bare-bones (i.e, just starting out), add the following to your settings.py:
|
Add the following settings to settings.py:
|
||||||
|
|
||||||
AUTH_PROFILE_MODULE = 'twython_django_oauth.Profile'
|
TWITTER_KEY = 'your_key'
|
||||||
|
|
||||||
(Obviously, if you've got your own custom User/Profile setup going, this should all be pretty self explanatory
|
TWITTER_SECRET = 'your_secret'
|
||||||
to integrate into your application. The OAuth handshake flow is well documented here, as well as how to use it
|
|
||||||
with Twython calls.)
|
LOGIN_URL='/your_url_extension/login'
|
||||||
|
|
||||||
|
LOGOUT_URL='/your_url_extension/logout'
|
||||||
|
|
||||||
|
LOGIN_REDIRECT_URL='/'
|
||||||
|
|
||||||
|
LOGOUT_REDIRECT_URL='/'
|
||||||
|
|
||||||
Restart your Django app, and it should all work auto-magically. Build onwards from here if you're
|
Restart your Django app, and it should all work auto-magically. Build onwards from here if you're
|
||||||
just starting out, or integrate this into your existing model setup if you're already Django-savvy.
|
just starting out, or integrate this into your existing model setup if you're already Django-savvy.
|
||||||
|
|
|
||||||
39
setup.py
Normal file
39
setup.py
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
from setuptools import setup
|
||||||
|
from setuptools import find_packages
|
||||||
|
|
||||||
|
__author__ = 'Ryan McGrath <ryan@venodesigns.net>'
|
||||||
|
__version__ = '1.4.5'
|
||||||
|
|
||||||
|
setup(
|
||||||
|
# Basic package information.
|
||||||
|
name = 'twython-django',
|
||||||
|
version = __version__,
|
||||||
|
packages = find_packages(),
|
||||||
|
|
||||||
|
# Packaging options.
|
||||||
|
include_package_data = True,
|
||||||
|
|
||||||
|
# Package dependencies.
|
||||||
|
install_requires = ['simplejson', 'oauth2', 'httplib2', 'twython', 'django'],
|
||||||
|
provides = ['twython_django_oauth'],
|
||||||
|
|
||||||
|
# Metadata for PyPI.
|
||||||
|
author = 'Ryan McGrath',
|
||||||
|
author_email = 'ryan@venodesigns.net',
|
||||||
|
license = 'MIT License',
|
||||||
|
url = 'http://github.com/ryanmcgrath/twython-django/tree/master',
|
||||||
|
keywords = 'Django integration for twython',
|
||||||
|
description = 'An easy (and up to date) way to access Twitter data with Python.',
|
||||||
|
long_description = open('README.markdown').read(),
|
||||||
|
classifiers = [
|
||||||
|
'Development Status :: 4 - Beta',
|
||||||
|
'Intended Audience :: Developers',
|
||||||
|
'License :: OSI Approved :: MIT License',
|
||||||
|
'Topic :: Software Development :: Libraries :: Python Modules',
|
||||||
|
'Topic :: Communications :: Chat',
|
||||||
|
'Topic :: Internet'
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
class Profile(models.Model):
|
class TwitterProfile(models.Model):
|
||||||
"""
|
"""
|
||||||
An example Profile model that handles storing the oauth_token and
|
An example Profile model that handles storing the oauth_token and
|
||||||
oauth_secret in relation to a user. Adapt this if you have a current
|
oauth_secret in relation to a user. Adapt this if you have a current
|
||||||
setup, there's really nothing special going on here.
|
setup, there's really nothing special going on here.
|
||||||
"""
|
"""
|
||||||
user = models.ForeignKey(User)
|
user = models.OneToOneField(User)
|
||||||
oauth_token = models.CharField(max_length = 200)
|
oauth_token = models.CharField(max_length = 200)
|
||||||
oauth_secret = models.CharField(max_length = 200)
|
oauth_secret = models.CharField(max_length = 200)
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
from django.conf.urls.defaults import *
|
from django.conf.urls.defaults import *
|
||||||
|
|
||||||
# your_app = name of your root djang app.
|
# your_app = name of your root djang app.
|
||||||
urlpatterns = patterns('your_app.twython_django_oauth.views',
|
urlpatterns = patterns('twython_django_oauth.views',
|
||||||
|
|
||||||
# First leg of the authentication journey...
|
# First leg of the authentication journey...
|
||||||
(r'^login/?$', "begin_auth"),
|
url(r'^login/?$', "begin_auth", name="twitter_login"),
|
||||||
|
|
||||||
# Logout, if need be
|
# Logout, if need be
|
||||||
(r'^/logout?$', "logout"), # Calling logout and what not
|
url(r'^logout/?$', "logout", name="twitter_logout"), # Calling logout and what not
|
||||||
|
|
||||||
# This is where they're redirected to after authorizing - we'll
|
# This is where they're redirected to after authorizing - we'll
|
||||||
# further (silently) redirect them again here after storing tokens and such.
|
# further (silently) redirect them again here after storing tokens and such.
|
||||||
(r'^thanks/?$', "thanks"),
|
url(r'^thanks/?$', "thanks", name="twitter_callback"),
|
||||||
|
|
||||||
# An example view using a Twython method with proper OAuth credentials. Clone
|
# An example view using a Twython method with proper OAuth credentials. Clone
|
||||||
# this view and url definition to get the rest of your desired pages/functionality.
|
# this view and url definition to get the rest of your desired pages/functionality.
|
||||||
(r'^user_timeline/?$', "user_timeline"),
|
url(r'^user_timeline/?$', "user_timeline", name="twitter_timeline"),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,24 @@
|
||||||
from django.contrib.auth import authenticate, login, logout
|
from django.contrib.auth import authenticate, login, logout as django_logout
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.http import HttpResponse, HttpResponseRedirect
|
from django.http import HttpResponse, HttpResponseRedirect
|
||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.conf import settings
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
from twython import Twython
|
from twython import Twython
|
||||||
|
|
||||||
# If you've got your own Profile setup, see the note in the models file
|
# If you've got your own Profile setup, see the note in the models file
|
||||||
# about adapting this to your own setup.
|
# about adapting this to your own setup.
|
||||||
from your_app.twython_django_oauth.models import Profile
|
from twython_django_oauth.models import TwitterProfile
|
||||||
|
|
||||||
# Move these into your settings.py if you're feeling adventurous.
|
def logout(request, redirect_url=settings.LOGOUT_REDIRECT_URL):
|
||||||
CONSUMER_KEY = "YOUR CONSUMER KEY HERE"
|
|
||||||
CONSUMER_SECRET = "YOUR CONSUMER SECRET HERE"
|
|
||||||
|
|
||||||
def logout(request):
|
|
||||||
"""
|
"""
|
||||||
Nothing hilariously hidden here, logs a user out. Strip this out if your
|
Nothing hilariously hidden here, logs a user out. Strip this out if your
|
||||||
application already has hooks to handle this.
|
application already has hooks to handle this.
|
||||||
"""
|
"""
|
||||||
logout(request)
|
django_logout(request)
|
||||||
return HttpResponseRedirect('/')
|
return HttpResponseRedirect(request.build_absolute_uri(redirect_url))
|
||||||
|
|
||||||
def begin_auth(request):
|
def begin_auth(request):
|
||||||
"""
|
"""
|
||||||
|
|
@ -29,8 +27,9 @@ def begin_auth(request):
|
||||||
"""
|
"""
|
||||||
# Instantiate Twython with the first leg of our trip.
|
# Instantiate Twython with the first leg of our trip.
|
||||||
twitter = Twython(
|
twitter = Twython(
|
||||||
twitter_token = CONSUMER_KEY,
|
twitter_token = settings.TWITTER_KEY,
|
||||||
twitter_secret = CONSUMER_SECRET
|
twitter_secret = settings.TWITTER_SECRET,
|
||||||
|
callback_url = request.build_absolute_uri(reverse('twython_django_oauth.views.thanks'))
|
||||||
)
|
)
|
||||||
|
|
||||||
# Request an authorization url to send the user to...
|
# Request an authorization url to send the user to...
|
||||||
|
|
@ -40,7 +39,7 @@ def begin_auth(request):
|
||||||
request.session['request_token'] = auth_props
|
request.session['request_token'] = auth_props
|
||||||
return HttpResponseRedirect(auth_props['auth_url'])
|
return HttpResponseRedirect(auth_props['auth_url'])
|
||||||
|
|
||||||
def thanks(request):
|
def thanks(request, redirect_url=settings.LOGIN_REDIRECT_URL):
|
||||||
"""
|
"""
|
||||||
A user gets redirected here after hitting Twitter and authorizing your
|
A user gets redirected here after hitting Twitter and authorizing your
|
||||||
app to use their data.
|
app to use their data.
|
||||||
|
|
@ -53,10 +52,10 @@ def thanks(request):
|
||||||
# Now that we've got the magic tokens back from Twitter, we need to exchange
|
# Now that we've got the magic tokens back from Twitter, we need to exchange
|
||||||
# for permanent ones and store them...
|
# for permanent ones and store them...
|
||||||
twitter = Twython(
|
twitter = Twython(
|
||||||
twitter_token = CONSUMER_KEY,
|
twitter_token = settings.TWITTER_KEY,
|
||||||
twitter_secret = CONSUMER_SECRET,
|
twitter_secret = settings.TWITTER_SECRET,
|
||||||
oauth_token = request.session['request_token']['oauth_token'],
|
oauth_token = request.session['request_token']['oauth_token'],
|
||||||
oauth_token_secret = request.session['request_token']['oauth_token_secret']
|
oauth_token_secret = request.session['request_token']['oauth_token_secret'],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Retrieve the tokens we want...
|
# Retrieve the tokens we want...
|
||||||
|
|
@ -68,7 +67,7 @@ def thanks(request):
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
# We mock a creation here; no email, password is just the token, etc.
|
# We mock a creation here; no email, password is just the token, etc.
|
||||||
user = User.objects.create_user(authorized_tokens['screen_name'], "fjdsfn@jfndjfn.com", authorized_tokens['oauth_token_secret'])
|
user = User.objects.create_user(authorized_tokens['screen_name'], "fjdsfn@jfndjfn.com", authorized_tokens['oauth_token_secret'])
|
||||||
profile = Profile()
|
profile = TwitterProfile()
|
||||||
profile.user = user
|
profile.user = user
|
||||||
profile.oauth_token = authorized_tokens['oauth_token']
|
profile.oauth_token = authorized_tokens['oauth_token']
|
||||||
profile.oauth_secret = authorized_tokens['oauth_token_secret']
|
profile.oauth_secret = authorized_tokens['oauth_token_secret']
|
||||||
|
|
@ -79,17 +78,17 @@ def thanks(request):
|
||||||
password = authorized_tokens['oauth_token_secret']
|
password = authorized_tokens['oauth_token_secret']
|
||||||
)
|
)
|
||||||
login(request, user)
|
login(request, user)
|
||||||
return HttpResponseRedirect('/timeline')
|
return HttpResponseRedirect(redirect_url)
|
||||||
|
|
||||||
def user_timeline(request):
|
def user_timeline(request):
|
||||||
"""
|
"""
|
||||||
An example view with Twython/OAuth hooks/calls to fetch data about the user
|
An example view with Twython/OAuth hooks/calls to fetch data about the user
|
||||||
in question. Pretty self explanatory if you read through it...
|
in question. Pretty self explanatory if you read through it...
|
||||||
"""
|
"""
|
||||||
user = request.user.get_profile()
|
user = request.user.twitterprofile
|
||||||
twitter = Twython(
|
twitter = Twython(
|
||||||
twitter_token = CONSUMER_KEY,
|
twitter_token = settings.TWITTER_KEY,
|
||||||
twitter_secret = CONSUMER_SECRET,
|
twitter_secret = settings.TWITTER_SECRET,
|
||||||
oauth_token = user.oauth_token,
|
oauth_token = user.oauth_token,
|
||||||
oauth_token_secret = user.oauth_secret
|
oauth_token_secret = user.oauth_secret
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Reference in a new issue