Last active
June 19, 2017 19:10
-
-
Save TaijaQ/45a8c360fb68b26cd30c85528f29c2f2 to your computer and use it in GitHub Desktop.
Django Model-View-Controller architecture example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # models.py (the database tables) | |
| from django.db import models | |
| class Book(models.Model): | |
| name = models.CharField(max_length=50) | |
| pub_date = models.DateField() | |
| # views.py (the business logic) | |
| from django.shortcuts import render | |
| from models import Book | |
| def latest_books(request): | |
| book_list = Book.objects.order_by('-pub_date')[:10] | |
| return render(request, 'latest_books.html', {'book_list': book_list}) | |
| # urls.py (the URL configuration) | |
| from django.conf.urls.defaults import * | |
| import views | |
| urlpatterns = patterns('', | |
| (r'^latest/$', views.latest_books), | |
| ) | |
| # latest_books.html (the template) | |
| <html><head><title>Books</title></head> | |
| <body> | |
| <h1>Books</h1> | |
| <ul> | |
| {% for book in book_list %} | |
| <li>{{ book.name }}</li> | |
| {% endfor %} | |
| </ul> | |
| </body></html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- coding: utf-8 -*- | |
| from django.contrib.auth.decorators import login_required | |
| from django.utils.cache import patch_response_headers | |
| from django.utils.decorators import method_decorator | |
| from django.views.decorators.cache import cache_page, never_cache | |
| from django.views.decorators.csrf import csrf_exempt | |
| class NeverCacheMixin(object): | |
| @method_decorator(never_cache) | |
| def dispatch(self, *args, **kwargs): | |
| return super(NeverCacheMixin, self).dispatch(*args, **kwargs) | |
| class LoginRequiredMixin(object): | |
| @method_decorator(login_required) | |
| def dispatch(self, *args, **kwargs): | |
| return super(LoginRequiredMixin, self).dispatch(*args, **kwargs) | |
| class CSRFExemptMixin(object): | |
| @method_decorator(csrf_exempt) | |
| def dispatch(self, *args, **kwargs): | |
| return super(CSRFExemptMixin, self).dispatch(*args, **kwargs) | |
| class CacheMixin(object): | |
| cache_timeout = 60 | |
| def get_cache_timeout(self): | |
| return self.cache_timeout | |
| def dispatch(self, *args, **kwargs): | |
| return cache_page(self.get_cache_timeout())(super(CacheMixin, self).dispatch)(*args, **kwargs) | |
| class CacheControlMixin(object): | |
| cache_timeout = 60 | |
| def get_cache_timeout(self): | |
| return self.cache_timeout | |
| def dispatch(self, *args, **kwargs): | |
| response = super(CacheControlMixin, self).dispatch(*args, **kwargs) | |
| patch_response_headers(response, self.get_cache_timeout()) | |
| return response | |
| class JitterCacheMixin(CacheControlMixin): | |
| cache_range = [40, 80] | |
| def get_cache_range(self): | |
| return self.cache_range | |
| def get_cache_timeout(self): | |
| return random.randint(*self.get_cache_range()) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| jQuery templates use constructs like: | |
| {{if condition}} print something{{/if}} | |
| Or like: | |
| {% if condition %} print {%=object.something %}{% endif %} | |
| This, of course, completely screws up Django templates, | |
| because Django thinks {{ and }} mean something. | |
| Wrap {% verbatim %} and {% endverbatim %} around those | |
| blocks of jQuery templates and this will try its best | |
| to output the contents with no changes. | |
| """ | |
| from django import template | |
| register = template.Library() | |
| class VerbatimNode(template.Node): | |
| def __init__(self, text): | |
| self.text = text | |
| def render(self, context): | |
| return self.text | |
| @register.tag | |
| def verbatim(parser, token): | |
| text = [] | |
| while 1: | |
| token = parser.tokens.pop(0) | |
| if token.contents == 'endverbatim': | |
| break | |
| if token.token_type == template.TOKEN_VAR: | |
| text.append('{{ ') | |
| elif token.token_type == template.TOKEN_BLOCK: | |
| text.append('{%') | |
| text.append(token.contents) | |
| if token.token_type == template.TOKEN_VAR: | |
| text.append(' }}') | |
| elif token.token_type == template.TOKEN_BLOCK: | |
| if not text[-1].startswith('='): | |
| text[-1:-1] = [' '] | |
| text.append(' %}') | |
| return VerbatimNode(''.join(text)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment