Skip to content

Commit d56ad55

Browse files
Adds indexes to the OAuth2 related models.
Since the access token table grows extremely quickly, it is imperative that we have proper indexes on this table. Additionally, we should make sure that refresh tokens have indexes too.
1 parent 5412a45 commit d56ad55

File tree

2 files changed

+124
-5
lines changed

2 files changed

+124
-5
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# -*- coding: utf-8 -*-
2+
import datetime
3+
from south.db import db
4+
from south.v2 import SchemaMigration
5+
from django.db import models
6+
7+
try:
8+
from django.contrib.auth import get_user_model
9+
except ImportError: # django < 1.5
10+
from django.contrib.auth.models import User
11+
else:
12+
User = get_user_model()
13+
14+
from oauth2_provider.models import get_application_model
15+
ApplicationModel = get_application_model()
16+
17+
18+
class Migration(SchemaMigration):
19+
20+
def forwards(self, orm):
21+
# Adding index on 'RefreshToken', fields ['token']
22+
db.create_index(u'oauth2_provider_refreshtoken', ['token'])
23+
24+
# Adding index on 'Grant', fields ['code']
25+
db.create_index(u'oauth2_provider_grant', ['code'])
26+
27+
# Adding index on 'AccessToken', fields ['token']
28+
db.create_index(u'oauth2_provider_accesstoken', ['token'])
29+
30+
31+
def backwards(self, orm):
32+
# Removing index on 'AccessToken', fields ['token']
33+
db.delete_index(u'oauth2_provider_accesstoken', ['token'])
34+
35+
# Removing index on 'Grant', fields ['code']
36+
db.delete_index(u'oauth2_provider_grant', ['code'])
37+
38+
# Removing index on 'RefreshToken', fields ['token']
39+
db.delete_index(u'oauth2_provider_refreshtoken', ['token'])
40+
41+
42+
models = {
43+
u'auth.group': {
44+
'Meta': {'object_name': 'Group'},
45+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46+
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
47+
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
48+
},
49+
u'auth.permission': {
50+
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
51+
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
52+
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
53+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
54+
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
55+
},
56+
u"%s.%s" % (User._meta.app_label, User._meta.object_name): {
57+
'Meta': {'object_name': User.__name__},
58+
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
59+
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
60+
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
61+
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
62+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
63+
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
64+
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
65+
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
66+
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
67+
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
68+
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
69+
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
70+
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
71+
},
72+
u'contenttypes.contenttype': {
73+
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
74+
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
75+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
76+
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
77+
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
78+
},
79+
u'oauth2_provider.accesstoken': {
80+
'Meta': {'object_name': 'AccessToken'},
81+
'application': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s.%s']"% (ApplicationModel._meta.app_label, ApplicationModel._meta.object_name)}),
82+
'expires': ('django.db.models.fields.DateTimeField', [], {}),
83+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
84+
'scope': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
85+
'token': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
86+
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s.%s']"% (User._meta.app_label, User._meta.object_name)})
87+
},
88+
u"%s.%s" % (ApplicationModel._meta.app_label, ApplicationModel._meta.object_name): {
89+
'Meta': {'object_name': ApplicationModel.__name__},
90+
'authorization_grant_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
91+
'client_id': ('django.db.models.fields.CharField', [], {'default': "'30f17d266183cd455bc57ce8548a439db3491353'", 'unique': 'True', 'max_length': '100'}),
92+
'client_secret': ('django.db.models.fields.CharField', [], {'default': "'18e68df61ad8e1af355644ddf6a636b269b6309aafbd2a34d4f5ed6c5562e44c0792c5b2441571e85cbf8a85249dca5537dedb6fd6f60e134f4a60f3865c8395'", 'max_length': '255', 'blank': 'True'}),
93+
'client_type': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
94+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
95+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
96+
'redirect_uris': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
97+
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s.%s']"% (User._meta.app_label, User._meta.object_name)})
98+
},
99+
u'oauth2_provider.grant': {
100+
'Meta': {'object_name': 'Grant'},
101+
'application': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s.%s']"% (ApplicationModel._meta.app_label, ApplicationModel._meta.object_name)}),
102+
'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
103+
'expires': ('django.db.models.fields.DateTimeField', [], {}),
104+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
105+
'redirect_uri': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
106+
'scope': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
107+
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s.%s']"% (User._meta.app_label, User._meta.object_name)})
108+
},
109+
u'oauth2_provider.refreshtoken': {
110+
'Meta': {'object_name': 'RefreshToken'},
111+
'access_token': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'refresh_token'", 'unique': 'True', 'to': u"orm['oauth2_provider.AccessToken']"}),
112+
'application': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s.%s']"% (ApplicationModel._meta.app_label, ApplicationModel._meta.object_name)}),
113+
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
114+
'token': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
115+
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s.%s']"% (User._meta.app_label, User._meta.object_name)})
116+
}
117+
}
118+
119+
complete_apps = ['oauth2_provider']

oauth2_provider/models.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class AbstractApplication(models.Model):
5959
)
6060

6161
client_id = models.CharField(max_length=100, unique=True,
62-
default=generate_client_id)
62+
default=generate_client_id, db_index=True)
6363
user = models.ForeignKey(AUTH_USER_MODEL)
6464
help_text = _("Allowed URIs list, space separated")
6565
redirect_uris = models.TextField(help_text=help_text,
@@ -68,7 +68,7 @@ class AbstractApplication(models.Model):
6868
authorization_grant_type = models.CharField(max_length=32,
6969
choices=GRANT_TYPES)
7070
client_secret = models.CharField(max_length=255, blank=True,
71-
default=generate_client_secret)
71+
default=generate_client_secret, db_index=True)
7272
name = models.CharField(max_length=255, blank=True)
7373

7474
class Meta:
@@ -135,7 +135,7 @@ class Grant(models.Model):
135135
* :attr:`scope` Required scopes, optional
136136
"""
137137
user = models.ForeignKey(AUTH_USER_MODEL)
138-
code = models.CharField(max_length=255) # code comes from oauthlib
138+
code = models.CharField(max_length=255, db_index=True) # code comes from oauthlib
139139
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL)
140140
expires = models.DateTimeField()
141141
redirect_uri = models.CharField(max_length=255)
@@ -170,7 +170,7 @@ class AccessToken(models.Model):
170170
* :attr:`scope` Allowed scopes
171171
"""
172172
user = models.ForeignKey(AUTH_USER_MODEL)
173-
token = models.CharField(max_length=255)
173+
token = models.CharField(max_length=255, db_index=True)
174174
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL)
175175
expires = models.DateTimeField()
176176
scope = models.TextField(blank=True)
@@ -222,7 +222,7 @@ class RefreshToken(models.Model):
222222
bounded to
223223
"""
224224
user = models.ForeignKey(AUTH_USER_MODEL)
225-
token = models.CharField(max_length=255)
225+
token = models.CharField(max_length=255, db_index=True)
226226
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL)
227227
access_token = models.OneToOneField(AccessToken,
228228
related_name='refresh_token')

0 commit comments

Comments
 (0)