diff --git a/DjangoBlog/feeds.py b/DjangoBlog/feeds.py index 245ef8c..32606b8 100644 --- a/DjangoBlog/feeds.py +++ b/DjangoBlog/feeds.py @@ -17,7 +17,7 @@ from django.contrib.syndication.views import Feed from blog.models import Article from django.conf import settings from django.utils.feedgenerator import Rss201rev2Feed -from DjangoBlog.common_markdown import common_markdown +from DjangoBlog.utils import common_markdown from django.contrib.auth import get_user_model from django.contrib.auth.models import User from django.contrib.sites.models import Site diff --git a/DjangoBlog/common_markdown.py b/DjangoBlog/utils.py similarity index 66% rename from DjangoBlog/common_markdown.py rename to DjangoBlog/utils.py index 3ff5605..ee75dfe 100644 --- a/DjangoBlog/common_markdown.py +++ b/DjangoBlog/utils.py @@ -5,20 +5,42 @@ """ @version: ?? @author: liangliangyy -@license: MIT Licence +@license: MIT Licence @contact: liangliangyy@gmail.com @site: https://www.lylinux.org/ @software: PyCharm -@file: common_markdown.py -@time: 2017/1/14 上午2:30 +@file: utils.py +@time: 2017/1/19 上午2:30 """ - +from django.core.cache import cache +from hashlib import md5 import mistune from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import html +def cache_decorator(expiration=3 * 60): + def wrapper(func): + def news(*args, **kwargs): + unique_str = repr((func, args, kwargs)) + m = md5(unique_str.encode('utf-8')) + key = m.hexdigest() + value = cache.get(key) + if value: + print('get key: ' + key) + return value + else: + print('set key:' + key) + value = func(*args, **kwargs) + cache.set(key, value, expiration) + return value + + return news + + return wrapper + + def block_code(text, lang, inlinestyles=False, linenos=False): if not lang: text = text.strip() diff --git a/blog/context_processors.py b/blog/context_processors.py index d7171ee..babc64f 100644 --- a/blog/context_processors.py +++ b/blog/context_processors.py @@ -14,17 +14,25 @@ """ from .models import Category, Article, Tag from django.conf import settings +from django.core.cache import cache def seo_processor(requests): - return { - 'SITE_NAME': settings.SITE_NAME, - 'SHOW_GOOGLE_ADSENSE': settings.SHOW_GOOGLE_ADSENSE, - 'SITE_SEO_DESCRIPTION': settings.SITE_SEO_DESCRIPTION, - 'SITE_DESCRIPTION': settings.SITE_DESCRIPTION, - 'SITE_KEYWORDS': settings.SITE_SEO_KEYWORDS, - 'SITE_BASE_URL': 'http://' + requests.get_host() + '/', - 'ARTICLE_SUB_LENGTH': settings.ARTICLE_SUB_LENGTH, - 'nav_category_list': Category.objects.all(), - 'nav_pages': Article.objects.filter(type='p', status='p') - } + key = 'seo_processor' + value = cache.get(key) + if value: + return value + else: + value = { + 'SITE_NAME': settings.SITE_NAME, + 'SHOW_GOOGLE_ADSENSE': settings.SHOW_GOOGLE_ADSENSE, + 'SITE_SEO_DESCRIPTION': settings.SITE_SEO_DESCRIPTION, + 'SITE_DESCRIPTION': settings.SITE_DESCRIPTION, + 'SITE_KEYWORDS': settings.SITE_SEO_KEYWORDS, + 'SITE_BASE_URL': 'https://' + requests.get_host() + '/', + 'ARTICLE_SUB_LENGTH': settings.ARTICLE_SUB_LENGTH, + 'nav_category_list': Category.objects.all(), + 'nav_pages': Article.objects.filter(type='p', status='p') + } + cache.set(key, value, 60 * 60 * 10) + return value diff --git a/blog/models.py b/blog/models.py index 4dcb669..d1c2273 100644 --- a/blog/models.py +++ b/blog/models.py @@ -5,9 +5,32 @@ from django.conf import settings from uuslug import slugify from DjangoBlog.spider_notify import sipder_notify from django.contrib.sites.models import Site +from DjangoBlog.utils import cache_decorator +from django.utils.functional import cached_property + +class BaseModel(models.Model): + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + + if 'update_fields' in kwargs and len(kwargs['update_fields']) == 1 and kwargs['update_fields'][0] == 'views': + return + try: + notify = sipder_notify() + notify_url = self.get_full_url() + notify.baidu_notify(notify_url) + except Exception as ex: + print(ex) + + def get_full_url(self): + site = Site.objects.get_current().domain + url = "https://{site}{path}".format(site=site, path=self.get_absolute_url()) + return url + + class Meta: + abstract = True -class Article(models.Model): +class Article(BaseModel): """文章""" STATUS_CHOICES = ( ('d', '草稿'), @@ -57,6 +80,7 @@ class Article(models.Model): 'slug': self.slug }) + @cache_decorator(60 * 60 * 10) def get_category_tree(self): names = [] @@ -73,17 +97,20 @@ class Article(models.Model): if not self.slug or self.slug == 'no-slug' or not self.id: # Only set the slug when the object is created. self.slug = slugify(self.title) + """ try: notify = sipder_notify() notify.notify(self.get_full_url()) except Exception as e: print(e) + """ super().save(*args, **kwargs) def viewed(self): self.views += 1 self.save(update_fields=['views']) + @cache_decorator(60 * 60 * 10) def comment_list(self): comments = self.comment_set.all() parent_comments = comments.filter(parent_comment=None) @@ -92,10 +119,15 @@ class Article(models.Model): info = (self._meta.app_label, self._meta.model_name) return reverse('admin:%s_%s_change' % info, args=(self.pk,)) - def get_full_url(self): - site = Site.objects.get_current().domain - article_url = "https://{site}{path}".format(site=site, path=self.get_absolute_url()) - return article_url + @cached_property + def next_article(self): + # 下一篇 + return Article.objects.filter(id__gt=self.id, status=0).order_by('id').first() + + @cached_property + def prev_article(self): + # 前一篇 + return Article.objects.filter(id__lt=self.id, status=0).first() ''' @@ -162,7 +194,7 @@ class BlogPage(models.Model): ''' -class Category(models.Model): +class Category(BaseModel): """文章分类""" name = models.CharField('分类名', max_length=30) created_time = models.DateTimeField('创建时间', auto_now_add=True) @@ -180,16 +212,8 @@ class Category(models.Model): def __str__(self): return self.name - def save(self, *args, **kwargs): - try: - notify = sipder_notify() - notify.notify(self.get_absolute_url()) - except Exception as e: - print(e) - super().save(*args, **kwargs) - -class Tag(models.Model): +class Tag(BaseModel): """文章标签""" name = models.CharField('标签名', max_length=30) created_time = models.DateTimeField('创建时间', auto_now_add=True) @@ -201,6 +225,7 @@ class Tag(models.Model): def get_absolute_url(self): return reverse('blog:tag_detail', kwargs={'tag_name': self.name}) + @cache_decorator(60 * 60 * 10) def get_article_count(self): return Article.objects.filter(tags__name=self.name).distinct().count() @@ -209,14 +234,6 @@ class Tag(models.Model): verbose_name = "标签" verbose_name_plural = verbose_name - def save(self, *args, **kwargs): - try: - notify = sipder_notify() - notify.notify(self.get_absolute_url()) - except Exception as e: - print(e) - super().save(*args, **kwargs) - class Links(models.Model): """友情链接""" diff --git a/blog/templatetags/blog_tags.py b/blog/templatetags/blog_tags.py index c4d48e9..16f3492 100644 --- a/blog/templatetags/blog_tags.py +++ b/blog/templatetags/blog_tags.py @@ -49,7 +49,7 @@ def datetimeformat(data): @register.filter(is_safe=True) @stringfilter def custom_markdown(content): - from DjangoBlog.common_markdown import common_markdown + from DjangoBlog.utils import common_markdown return mark_safe(common_markdown.get_markdown(content)) diff --git a/blog/views.py b/blog/views.py index 45f3412..650de52 100644 --- a/blog/views.py +++ b/blog/views.py @@ -74,17 +74,12 @@ class ArticleDetailView(DetailView): obj = super(ArticleDetailView, self).get_object() obj.viewed() # obj.body = markdown2.markdown(obj.body) + self.object = obj return obj def get_context_data(self, **kwargs): articleid = int(self.kwargs[self.pk_url_kwarg]) - def get_article(id): - try: - return Article.objects.get(pk=id) - except ObjectDoesNotExist: - return None - comment_form = CommentForm() u = self.request.user @@ -102,10 +97,9 @@ class ArticleDetailView(DetailView): kwargs['form'] = comment_form kwargs['article_comments'] = article_comments kwargs['comment_count'] = len(article_comments) if article_comments else 0; - next_article = get_article(articleid + 1) - prev_article = get_article(articleid - 1) - kwargs['next_article'] = next_article - kwargs['prev_article'] = prev_article + + kwargs['next_article'] = self.object.next_article + kwargs['prev_article'] = self.object.prev_article return super(ArticleDetailView, self).get_context_data(**kwargs) diff --git a/templates/blog/tags/article_meta_info.html b/templates/blog/tags/article_meta_info.html index 75b5a3e..6e8d337 100644 --- a/templates/blog/tags/article_meta_info.html +++ b/templates/blog/tags/article_meta_info.html @@ -23,17 +23,20 @@ 标签。 {% endif %} {% endif %} - 作者是。 + {{ article.author.username }} + + + + 。 {% if user.is_authenticated %} 编辑 {% endif %} diff --git a/templates/share_layout/base.html b/templates/share_layout/base.html index eb17866..0825e31 100644 --- a/templates/share_layout/base.html +++ b/templates/share_layout/base.html @@ -1,4 +1,5 @@ {% load static %} +{% load cache %}
{% block content %} {% endblock %} - {% block sidebar %} - {% endblock %} + {% cache 36000 nav %} + {% block sidebar %} + {% endblock %} + {% endcache %}
{% include 'share_layout/footer.html' %}