Skip to content

Commit 1877afc

Browse files
Merge pull request netbox-community#3069 from digitalocean/2647-caching
intial work on netbox-community#2647 - caching
2 parents 6f05579 + 351736c commit 1877afc

File tree

15 files changed

+148
-11
lines changed

15 files changed

+148
-11
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
sudo: required
22
services:
33
- postgresql
4+
- redis-server
45
addons:
56
postgresql: "9.4"
67
language: python

base_requirements.txt

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ django-filter
1818
# https://github.com/django-mptt/django-mptt
1919
django-mptt
2020

21+
# Django caching using Redis
22+
# https://github.com/niwinz/django-redis
23+
django-redis
24+
2125
# Abstraction models for rendering and paginating HTML tables
2226
# https://github.com/jieter/django-tables2
2327
django-tables2

netbox/circuits/views.py

+5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
from django.conf import settings
12
from django.contrib import messages
23
from django.contrib.auth.decorators import permission_required
34
from django.contrib.auth.mixins import PermissionRequiredMixin
45
from django.db import transaction
56
from django.db.models import Count
67
from django.shortcuts import get_object_or_404, redirect, render
8+
from django.utils.decorators import method_decorator
9+
from django.views.decorators.cache import cache_page
710
from django.views.generic import View
811

912
from extras.models import Graph, GRAPH_TYPE_PROVIDER
@@ -32,6 +35,7 @@ class ProviderListView(PermissionRequiredMixin, ObjectListView):
3235
class ProviderView(PermissionRequiredMixin, View):
3336
permission_required = 'circuits.view_provider'
3437

38+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
3539
def get(self, request, slug):
3640

3741
provider = get_object_or_404(Provider, slug=slug)
@@ -147,6 +151,7 @@ class CircuitListView(PermissionRequiredMixin, ObjectListView):
147151
class CircuitView(PermissionRequiredMixin, View):
148152
permission_required = 'circuits.view_circuit'
149153

154+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
150155
def get(self, request, pk):
151156

152157
circuit = get_object_or_404(Circuit.objects.select_related('provider', 'type', 'tenant__group'), pk=pk)

netbox/dcim/views.py

+22
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from django.utils.html import escape
1414
from django.utils.http import is_safe_url
1515
from django.utils.safestring import mark_safe
16+
from django.utils.decorators import method_decorator
17+
from django.views.decorators.cache import cache_page
1618
from django.views.generic import View
1719

1820
from circuits.models import Circuit
@@ -195,6 +197,7 @@ class SiteListView(PermissionRequiredMixin, ObjectListView):
195197
class SiteView(PermissionRequiredMixin, View):
196198
permission_required = 'dcim.view_site'
197199

200+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
198201
def get(self, request, slug):
199202

200203
site = get_object_or_404(Site.objects.select_related('region', 'tenant__group'), slug=slug)
@@ -353,6 +356,7 @@ class RackElevationListView(PermissionRequiredMixin, View):
353356
"""
354357
permission_required = 'dcim.view_rack'
355358

359+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
356360
def get(self, request):
357361

358362
racks = Rack.objects.select_related(
@@ -392,6 +396,7 @@ def get(self, request):
392396
class RackView(PermissionRequiredMixin, View):
393397
permission_required = 'dcim.view_rack'
394398

399+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
395400
def get(self, request, pk):
396401

397402
rack = get_object_or_404(Rack.objects.select_related('site__region', 'tenant__group', 'group', 'role'), pk=pk)
@@ -570,6 +575,7 @@ class DeviceTypeListView(PermissionRequiredMixin, ObjectListView):
570575
class DeviceTypeView(PermissionRequiredMixin, View):
571576
permission_required = 'dcim.view_devicetype'
572577

578+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
573579
def get(self, request, pk):
574580

575581
devicetype = get_object_or_404(DeviceType, pk=pk)
@@ -910,6 +916,7 @@ class DeviceListView(PermissionRequiredMixin, ObjectListView):
910916
class DeviceView(PermissionRequiredMixin, View):
911917
permission_required = 'dcim.view_device'
912918

919+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
913920
def get(self, request, pk):
914921

915922
device = get_object_or_404(Device.objects.select_related(
@@ -991,6 +998,7 @@ def get(self, request, pk):
991998
class DeviceInventoryView(PermissionRequiredMixin, View):
992999
permission_required = 'dcim.view_device'
9931000

1001+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
9941002
def get(self, request, pk):
9951003

9961004
device = get_object_or_404(Device, pk=pk)
@@ -1012,6 +1020,7 @@ def get(self, request, pk):
10121020
class DeviceStatusView(PermissionRequiredMixin, View):
10131021
permission_required = ('dcim.view_device', 'dcim.napalm_read')
10141022

1023+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
10151024
def get(self, request, pk):
10161025

10171026
device = get_object_or_404(Device, pk=pk)
@@ -1025,6 +1034,7 @@ def get(self, request, pk):
10251034
class DeviceLLDPNeighborsView(PermissionRequiredMixin, View):
10261035
permission_required = ('dcim.view_device', 'dcim.napalm_read')
10271036

1037+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
10281038
def get(self, request, pk):
10291039

10301040
device = get_object_or_404(Device, pk=pk)
@@ -1042,6 +1052,7 @@ def get(self, request, pk):
10421052
class DeviceConfigView(PermissionRequiredMixin, View):
10431053
permission_required = ('dcim.view_device', 'dcim.napalm_read')
10441054

1055+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
10451056
def get(self, request, pk):
10461057

10471058
device = get_object_or_404(Device, pk=pk)
@@ -1279,6 +1290,7 @@ class PowerOutletBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
12791290
class InterfaceView(PermissionRequiredMixin, View):
12801291
permission_required = 'dcim.view_interface'
12811292

1293+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
12821294
def get(self, request, pk):
12831295

12841296
interface = get_object_or_404(Interface, pk=pk)
@@ -1499,6 +1511,7 @@ class DeviceBayDeleteView(PermissionRequiredMixin, ObjectDeleteView):
14991511
class DeviceBayPopulateView(PermissionRequiredMixin, View):
15001512
permission_required = 'dcim.change_devicebay'
15011513

1514+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
15021515
def get(self, request, pk):
15031516

15041517
device_bay = get_object_or_404(DeviceBay, pk=pk)
@@ -1533,6 +1546,7 @@ def post(self, request, pk):
15331546
class DeviceBayDepopulateView(PermissionRequiredMixin, View):
15341547
permission_required = 'dcim.change_devicebay'
15351548

1549+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
15361550
def get(self, request, pk):
15371551

15381552
device_bay = get_object_or_404(DeviceBay, pk=pk)
@@ -1672,6 +1686,7 @@ class CableListView(PermissionRequiredMixin, ObjectListView):
16721686
class CableView(PermissionRequiredMixin, View):
16731687
permission_required = 'dcim.view_cable'
16741688

1689+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
16751690
def get(self, request, pk):
16761691

16771692
cable = get_object_or_404(Cable, pk=pk)
@@ -1687,6 +1702,7 @@ class CableTraceView(PermissionRequiredMixin, View):
16871702
"""
16881703
permission_required = 'dcim.view_cable'
16891704

1705+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
16901706
def get(self, request, model, pk):
16911707

16921708
obj = get_object_or_404(model, pk=pk)
@@ -1726,6 +1742,7 @@ def dispatch(self, request, *args, **kwargs):
17261742

17271743
return super().dispatch(request, *args, **kwargs)
17281744

1745+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
17291746
def get(self, request, *args, **kwargs):
17301747

17311748
# Parse initial data manually to avoid setting field values as lists
@@ -2042,6 +2059,7 @@ def post(self, request):
20422059
class VirtualChassisEditView(PermissionRequiredMixin, GetReturnURLMixin, View):
20432060
permission_required = 'dcim.change_virtualchassis'
20442061

2062+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
20452063
def get(self, request, pk):
20462064

20472065
virtual_chassis = get_object_or_404(VirtualChassis, pk=pk)
@@ -2110,6 +2128,7 @@ class VirtualChassisDeleteView(PermissionRequiredMixin, ObjectDeleteView):
21102128
class VirtualChassisAddMemberView(PermissionRequiredMixin, GetReturnURLMixin, View):
21112129
permission_required = 'dcim.change_virtualchassis'
21122130

2131+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
21132132
def get(self, request, pk):
21142133

21152134
virtual_chassis = get_object_or_404(VirtualChassis, pk=pk)
@@ -2164,6 +2183,7 @@ def post(self, request, pk):
21642183
class VirtualChassisRemoveMemberView(PermissionRequiredMixin, GetReturnURLMixin, View):
21652184
permission_required = 'dcim.change_virtualchassis'
21662185

2186+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
21672187
def get(self, request, pk):
21682188

21692189
device = get_object_or_404(Device, pk=pk, virtual_chassis__isnull=False)
@@ -2227,6 +2247,7 @@ class PowerPanelListView(PermissionRequiredMixin, ObjectListView):
22272247
class PowerPanelView(PermissionRequiredMixin, View):
22282248
permission_required = 'dcim.view_powerpanel'
22292249

2250+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
22302251
def get(self, request, pk):
22312252

22322253
powerpanel = get_object_or_404(PowerPanel.objects.select_related('site', 'rack_group'), pk=pk)
@@ -2296,6 +2317,7 @@ class PowerFeedListView(PermissionRequiredMixin, ObjectListView):
22962317
class PowerFeedView(PermissionRequiredMixin, View):
22972318
permission_required = 'dcim.view_powerfeed'
22982319

2320+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
22992321
def get(self, request, pk):
23002322

23012323
powerfeed = get_object_or_404(PowerFeed.objects.select_related('power_panel', 'rack'), pk=pk)

netbox/extras/views.py

+9
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from django.http import Http404
88
from django.shortcuts import get_object_or_404, redirect, render
99
from django.utils.safestring import mark_safe
10+
from django.utils.decorators import method_decorator
11+
from django.views.decorators.cache import cache_page
1012
from django.views.generic import View
1113
from django_tables2 import RequestConfig
1214

@@ -41,6 +43,7 @@ class TagListView(ObjectListView):
4143

4244
class TagView(View):
4345

46+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
4447
def get(self, request, slug):
4548

4649
tag = get_object_or_404(Tag, slug=slug)
@@ -108,6 +111,7 @@ class ConfigContextListView(PermissionRequiredMixin, ObjectListView):
108111
class ConfigContextView(PermissionRequiredMixin, View):
109112
permission_required = 'extras.view_configcontext'
110113

114+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
111115
def get(self, request, pk):
112116

113117
configcontext = get_object_or_404(ConfigContext, pk=pk)
@@ -155,6 +159,7 @@ class ObjectConfigContextView(View):
155159
object_class = None
156160
base_template = None
157161

162+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
158163
def get(self, request, pk):
159164

160165
obj = get_object_or_404(self.object_class, pk=pk)
@@ -187,6 +192,7 @@ class ObjectChangeListView(PermissionRequiredMixin, ObjectListView):
187192
class ObjectChangeView(PermissionRequiredMixin, View):
188193
permission_required = 'extras.view_objectchange'
189194

195+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
190196
def get(self, request, pk):
191197

192198
objectchange = get_object_or_404(ObjectChange, pk=pk)
@@ -209,6 +215,7 @@ class ObjectChangeLogView(View):
209215
Present a history of changes made to a particular object.
210216
"""
211217

218+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
212219
def get(self, request, model, **kwargs):
213220

214221
# Get object my model and kwargs (e.g. slug='foo')
@@ -282,6 +289,7 @@ class ReportListView(PermissionRequiredMixin, View):
282289
"""
283290
permission_required = 'extras.view_reportresult'
284291

292+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
285293
def get(self, request):
286294

287295
reports = get_reports()
@@ -306,6 +314,7 @@ class ReportView(PermissionRequiredMixin, View):
306314
"""
307315
permission_required = 'extras.view_reportresult'
308316

317+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
309318
def get(self, request, name):
310319

311320
# Retrieve the Report by "<module>.<report>"

netbox/ipam/views.py

+13
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from django.contrib.auth.mixins import PermissionRequiredMixin
44
from django.db.models import Count, Q
55
from django.shortcuts import get_object_or_404, redirect, render
6+
from django.utils.decorators import method_decorator
7+
from django.views.decorators.cache import cache_page
68
from django.views.generic import View
79
from django_tables2 import RequestConfig
810

@@ -125,6 +127,7 @@ class VRFListView(PermissionRequiredMixin, ObjectListView):
125127
class VRFView(PermissionRequiredMixin, View):
126128
permission_required = 'ipam.view_vrf'
127129

130+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
128131
def get(self, request, pk):
129132

130133
vrf = get_object_or_404(VRF.objects.all(), pk=pk)
@@ -319,6 +322,7 @@ def extra_context(self):
319322
class AggregateView(PermissionRequiredMixin, View):
320323
permission_required = 'ipam.view_aggregate'
321324

325+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
322326
def get(self, request, pk):
323327

324328
aggregate = get_object_or_404(Aggregate, pk=pk)
@@ -456,6 +460,7 @@ def alter_queryset(self, request):
456460
class PrefixView(PermissionRequiredMixin, View):
457461
permission_required = 'ipam.view_prefix'
458462

463+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
459464
def get(self, request, pk):
460465

461466
prefix = get_object_or_404(Prefix.objects.select_related(
@@ -500,6 +505,7 @@ def get(self, request, pk):
500505
class PrefixPrefixesView(PermissionRequiredMixin, View):
501506
permission_required = 'ipam.view_prefix'
502507

508+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
503509
def get(self, request, pk):
504510

505511
prefix = get_object_or_404(Prefix.objects.all(), pk=pk)
@@ -543,6 +549,7 @@ def get(self, request, pk):
543549
class PrefixIPAddressesView(PermissionRequiredMixin, View):
544550
permission_required = 'ipam.view_prefix'
545551

552+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
546553
def get(self, request, pk):
547554

548555
prefix = get_object_or_404(Prefix.objects.all(), pk=pk)
@@ -643,6 +650,7 @@ class IPAddressListView(PermissionRequiredMixin, ObjectListView):
643650
class IPAddressView(PermissionRequiredMixin, View):
644651
permission_required = 'ipam.view_ipaddress'
645652

653+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
646654
def get(self, request, pk):
647655

648656
ipaddress = get_object_or_404(IPAddress.objects.select_related('vrf__tenant', 'tenant'), pk=pk)
@@ -726,6 +734,7 @@ def dispatch(self, request, *args, **kwargs):
726734

727735
return super().dispatch(request, *args, **kwargs)
728736

737+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
729738
def get(self, request):
730739

731740
form = forms.IPAddressAssignForm()
@@ -838,6 +847,7 @@ class VLANGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
838847
class VLANGroupVLANsView(PermissionRequiredMixin, View):
839848
permission_required = 'ipam.view_vlangroup'
840849

850+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
841851
def get(self, request, pk):
842852

843853
vlan_group = get_object_or_404(VLANGroup.objects.all(), pk=pk)
@@ -888,6 +898,7 @@ class VLANListView(PermissionRequiredMixin, ObjectListView):
888898
class VLANView(PermissionRequiredMixin, View):
889899
permission_required = 'ipam.view_vlan'
890900

901+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
891902
def get(self, request, pk):
892903

893904
vlan = get_object_or_404(VLAN.objects.select_related(
@@ -906,6 +917,7 @@ def get(self, request, pk):
906917
class VLANMembersView(PermissionRequiredMixin, View):
907918
permission_required = 'ipam.view_vlan'
908919

920+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
909921
def get(self, request, pk):
910922

911923
vlan = get_object_or_404(VLAN.objects.all(), pk=pk)
@@ -984,6 +996,7 @@ class ServiceListView(PermissionRequiredMixin, ObjectListView):
984996
class ServiceView(PermissionRequiredMixin, View):
985997
permission_required = 'ipam.view_service'
986998

999+
@method_decorator(cache_page(settings.CACHE_TIMEOUT))
9871000
def get(self, request, pk):
9881001

9891002
service = get_object_or_404(Service, pk=pk)

0 commit comments

Comments
 (0)