分类目录页面优化,部分代码格式调整

master
liangliangyy 9 years ago
parent af9ea12a55
commit d7274473fc

@ -17,7 +17,7 @@ from django.contrib.syndication.views import Feed
from blog.models import Article from blog.models import Article
from django.conf import settings from django.conf import settings
from django.utils.feedgenerator import Rss201rev2Feed from django.utils.feedgenerator import Rss201rev2Feed
from DjangoBlog.utils import common_markdown from DjangoBlog.utils import CommonMarkdown
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
@ -44,7 +44,7 @@ class DjangoBlogFeed(Feed):
return item.title return item.title
def item_description(self, item): def item_description(self, item):
return common_markdown.get_markdown(item.body) return CommonMarkdown.get_markdown(item.body)
def feed_copyright(self): def feed_copyright(self):
# print(Site.objects.get_current().name) # print(Site.objects.get_current().name)

@ -19,6 +19,7 @@ from accounts.models import BlogUser
from django.contrib.sitemaps import GenericSitemap from django.contrib.sitemaps import GenericSitemap
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
class StaticViewSitemap(Sitemap): class StaticViewSitemap(Sitemap):
priority = 0.5 priority = 0.5
changefreq = 'daily' changefreq = 'daily'

@ -18,7 +18,7 @@ import requests
from django.conf import settings from django.conf import settings
class spider_notify(): class SpiderNotify():
@staticmethod @staticmethod
def baidu_notify(urls): def baidu_notify(urls):
try: try:
@ -38,5 +38,5 @@ class spider_notify():
@staticmethod @staticmethod
def notify(self, url): def notify(self, url):
spider_notify.baidu_notify(url) SpiderNotify.baidu_notify(url)
spider_notify.__google_notify() SpiderNotify.__google_notify()

@ -111,7 +111,7 @@ class BlogMarkDownRenderer(mistune.Renderer):
return block_code(text, lang, inlinestyles, linenos) return block_code(text, lang, inlinestyles, linenos)
class common_markdown(): class CommonMarkdown():
@staticmethod @staticmethod
def get_markdown(value): def get_markdown(value):
renderer = BlogMarkDownRenderer(inlinestyles=False) renderer = BlogMarkDownRenderer(inlinestyles=False)

@ -22,7 +22,8 @@ class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(LoginForm, self).__init__(*args, **kwargs) super(LoginForm, self).__init__(*args, **kwargs)
self.fields['username'].widget = widgets.TextInput(attrs={'placeholder': "username", "class": "form-control"}) self.fields['username'].widget = widgets.TextInput(attrs={'placeholder': "username", "class": "form-control"})
self.fields['password'].widget = widgets.PasswordInput(attrs={'placeholder': "password", "class": "form-control"}) self.fields['password'].widget = widgets.PasswordInput(
attrs={'placeholder': "password", "class": "form-control"})
class RegisterForm(UserCreationForm): class RegisterForm(UserCreationForm):
@ -31,8 +32,10 @@ class RegisterForm(UserCreationForm):
self.fields['username'].widget = widgets.TextInput(attrs={'placeholder': "username", "class": "form-control"}) self.fields['username'].widget = widgets.TextInput(attrs={'placeholder': "username", "class": "form-control"})
self.fields['email'].widget = widgets.EmailInput(attrs={'placeholder': "email", "class": "form-control"}) self.fields['email'].widget = widgets.EmailInput(attrs={'placeholder': "email", "class": "form-control"})
self.fields['password1'].widget = widgets.PasswordInput(attrs={'placeholder': "password", "class": "form-control"}) self.fields['password1'].widget = widgets.PasswordInput(
self.fields['password2'].widget = widgets.PasswordInput(attrs={'placeholder': "repeat password", "class": "form-control"}) attrs={'placeholder': "password", "class": "form-control"})
self.fields['password2'].widget = widgets.PasswordInput(
attrs={'placeholder': "repeat password", "class": "form-control"})
class Meta: class Meta:
model = get_user_model() model = get_user_model()

@ -3,19 +3,8 @@ from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
# Create your models here.
"""
class BlogUserManager(BaseUserManager):
def create_user(self, email, username, password=None):
user = self.model(
username=username, email=email, nickname=username
)
user.set_password(password)
user.save(using=self._db)
return user
"""
# Create your models here.
class BlogUser(AbstractUser): class BlogUser(AbstractUser):
nickname = models.CharField('昵称', max_length=50, blank=True) nickname = models.CharField('昵称', max_length=50, blank=True)

@ -63,7 +63,7 @@ class LoginView(FormView):
if form.is_valid(): if form.is_valid():
from DjangoBlog.utils import cache from DjangoBlog.utils import cache
if cache != None: if cache and cache is not None:
cache.clear() cache.clear()
auth.login(self.request, form.get_user()) auth.login(self.request, form.get_user())

@ -15,7 +15,7 @@
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from blog.models import Article, Tag, Category from blog.models import Article, Tag, Category
from DjangoBlog.spider_notify import spider_notify from DjangoBlog.spider_notify import SpiderNotify
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
site = Site.objects.get_current().domain site = Site.objects.get_current().domain
@ -50,5 +50,5 @@ class Command(BaseCommand):
urls.append(self.get_full_url(url)) urls.append(self.get_full_url(url))
self.stdout.write(self.style.SUCCESS('start notify %d urls' % len(urls))) self.stdout.write(self.style.SUCCESS('start notify %d urls' % len(urls)))
spider_notify.baidu_notify(urls) SpiderNotify.baidu_notify(urls)
self.stdout.write(self.style.SUCCESS('finish notify')) self.stdout.write(self.style.SUCCESS('finish notify'))

@ -2,7 +2,7 @@ from django.db import models
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.conf import settings from django.conf import settings
from uuslug import slugify from uuslug import slugify
from DjangoBlog.spider_notify import spider_notify from DjangoBlog.spider_notify import SpiderNotify
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from DjangoBlog.utils import cache_decorator, logger, cache from DjangoBlog.utils import cache_decorator, logger, cache
from django.utils.functional import cached_property from django.utils.functional import cached_property
@ -22,7 +22,7 @@ class BaseModel(models.Model):
return return
try: try:
notify_url = self.get_full_url() notify_url = self.get_full_url()
spider_notify.baidu_notify([notify_url]) SpiderNotify.baidu_notify([notify_url])
except Exception as ex: except Exception as ex:
logger.error("notify sipder", ex) logger.error("notify sipder", ex)
print(ex) print(ex)
@ -75,8 +75,7 @@ class Article(BaseModel):
def get_absolute_url(self): def get_absolute_url(self):
return reverse('blog:detail', kwargs= return reverse('blog:detail', kwargs={
{
'article_id': self.id, 'article_id': self.id,
'year': self.created_time.year, 'year': self.created_time.year,
'month': self.created_time.month, 'month': self.created_time.month,
@ -86,14 +85,9 @@ class Article(BaseModel):
@cache_decorator(60 * 60 * 10) @cache_decorator(60 * 60 * 10)
def get_category_tree(self): def get_category_tree(self):
names = [] tree = self.category.get_category_tree()
names = list(map(lambda c: (c.name, c.get_absolute_url()), tree))
def parse(category):
names.append((category.name, category.get_absolute_url()))
if category.parent_category:
parse(category.parent_category)
parse(self.category)
return names return names
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -159,6 +153,43 @@ class Category(BaseModel):
def __str__(self): def __str__(self):
return self.name return self.name
@cache_decorator(60 * 60 * 10)
def get_category_tree(self):
"""
递归获得分类目录的父级
:return:
"""
categorys = []
def parse(category):
categorys.append(category)
if category.parent_category:
parse(category.parent_category)
parse(self)
return categorys
@cache_decorator(60 * 60 * 10)
def get_sub_categorys(self):
"""
获得当前分类目录所有子集
:return:
"""
categorys = []
all_categorys = Category.objects.all()
def parse(category):
if category not in categorys:
categorys.append(category)
childs = all_categorys.filter(parent_category=category)
for child in childs:
if category not in categorys:
categorys.append(child)
parse(child)
parse(self)
return categorys
class Tag(BaseModel): class Tag(BaseModel):
"""文章标签""" """文章标签"""

@ -21,7 +21,6 @@ class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
# title = indexes.CharField(document=True, use_template=True) # title = indexes.CharField(document=True, use_template=True)
text = indexes.CharField(document=True, use_template=True) text = indexes.CharField(document=True, use_template=True)
def get_model(self): def get_model(self):
return Article return Article

@ -51,8 +51,8 @@ def datetimeformat(data):
@register.filter(is_safe=True) @register.filter(is_safe=True)
@stringfilter @stringfilter
def custom_markdown(content): def custom_markdown(content):
from DjangoBlog.utils import common_markdown from DjangoBlog.utils import CommonMarkdown
return mark_safe(common_markdown.get_markdown(content)) return mark_safe(CommonMarkdown.get_markdown(content))
@register.filter(is_safe=True) @register.filter(is_safe=True)
@ -228,7 +228,7 @@ def gravatar_url(email, size=40):
"""获得gravatar头像""" """获得gravatar头像"""
email = email.encode('utf-8') email = email.encode('utf-8')
default = "https://avatar.duoshuo.com/avatar-50/928/120117.jpg".encode('utf-8') default = "https://resource.lylinux.net/image/2017/03/26/120117.jpg".encode('utf-8')
return "https://www.gravatar.com/avatar/%s?%s" % ( return "https://www.gravatar.com/avatar/%s?%s" % (
hashlib.md5(email.lower()).hexdigest(), urllib.parse.urlencode({'d': default, 's': str(size)})) hashlib.md5(email.lower()).hexdigest(), urllib.parse.urlencode({'d': default, 's': str(size)}))
@ -253,38 +253,3 @@ def query(qs, **kwargs):
""" """
return qs.filter(**kwargs) return qs.filter(**kwargs)
"""
article = Article.objects.get(pk=4)
comments = Comment.objects.filter(article=article)
for c in comments.filter(parent_comment=None):
datas = parse_commenttree(comments, c)
print(datas)
"""
"""
@register.tag
def parseCategoryName(parser,token):
tag_name, category = token.split_contents()
print(category)
print(tag_name)
return CategoryNametag(category)
class CategoryNametag(template.Node):
def __init__(self,category):
self.category=category
self.names=[]
def parseCategory(self,category):
self.names.append(category.name)
if category.parent_category:
self.parseCategory(category.parent_category)
def render(self, context):
self.parseCategory(self.category)
print(self.names)
return " > ".join(self.names)
#if self.category.parent_category:
"""

@ -42,4 +42,4 @@ class ArticleTest(TestCase):
article.status = 'p' article.status = 'p'
article.save() article.save()
response = self.client.get(article.get_absolute_url()) response = self.client.get(article.get_absolute_url())
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)

@ -123,7 +123,7 @@ class ArticleDetailView(DetailView):
kwargs['form'] = comment_form kwargs['form'] = comment_form
kwargs['article_comments'] = article_comments kwargs['article_comments'] = article_comments
kwargs['comment_count'] = len(article_comments) if article_comments else 0; kwargs['comment_count'] = len(article_comments) if article_comments else 0
kwargs['next_article'] = self.object.next_article kwargs['next_article'] = self.object.next_article
kwargs['prev_article'] = self.object.prev_article kwargs['prev_article'] = self.object.prev_article
@ -137,9 +137,13 @@ class CategoryDetailView(ArticleListView):
def get_queryset_data(self): def get_queryset_data(self):
slug = self.kwargs['category_name'] slug = self.kwargs['category_name']
category = get_object_or_404(Category, slug=slug) category = get_object_or_404(Category, slug=slug)
categoryname = category.name categoryname = category.name
self.categoryname = categoryname self.categoryname = categoryname
article_list = Article.objects.filter(category__name=categoryname, status='p') categorynames = list(map(lambda c: c.name, category.get_sub_categorys()))
print(categorynames)
# article_list = Article.objects.filter(category__name=categoryname, status='p')
article_list = Article.objects.filter(category__name__in=categorynames, status='p')
return article_list return article_list
def get_queryset_cache_key(self): def get_queryset_cache_key(self):
@ -247,28 +251,11 @@ def refresh_memcache(request):
if request.user.is_superuser: if request.user.is_superuser:
from DjangoBlog.utils import cache from DjangoBlog.utils import cache
if cache != None: cache.clear() if cache and cache is not None:
cache.clear()
return HttpResponse("ok") return HttpResponse("ok")
else: else:
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
return HttpResponseForbidden() return HttpResponseForbidden()
except Exception as e: except Exception as e:
return HttpResponse(e); return HttpResponse(e)
"""
class SeoProcessor():
__metaclass__ = ABCMeta
@abstractmethod
def get_title(self):
pass
@abstractmethod
def get_keywords(self):
pass
@abstractmethod
def get_description(self):
pass
"""

@ -1,10 +1,10 @@
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.core.mail import send_mail from django.core.mail import send_mail
from blog.models import Article
from django.core.mail import EmailMultiAlternatives from django.core.mail import EmailMultiAlternatives
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
import _thread import _thread
from blog.models import Article
from DjangoBlog.utils import cache from DjangoBlog.utils import cache

@ -30,7 +30,6 @@ def parse_commenttree(commentlist, comment):
datas = [] datas = []
def parse(c): def parse(c):
childs = commentlist.filter(parent_comment=c) childs = commentlist.filter(parent_comment=c)
for child in childs: for child in childs:
datas.append(child) datas.append(child)
@ -43,31 +42,8 @@ def parse_commenttree(commentlist, comment):
@register.inclusion_tag('comments/tags/comment_item.html') @register.inclusion_tag('comments/tags/comment_item.html')
def show_comment_item(comment, ischild): def show_comment_item(comment, ischild):
"""评论""" """评论"""
depth = 1 if ischild else 2; depth = 1 if ischild else 2
return { return {
'comment_item': comment, 'comment_item': comment,
'depth': depth 'depth': depth
} }
"""
@register.simple_tag(name='get_comment_count')
def GetCommentCount(parser, token):
commentcount = Comment.objects.filter(article__author_id=token).count()
return "0" if commentcount == 0 else str(commentcount) + " comments"
@register.inclusion_tag('comments/tags/post_comment.html')
def load_post_comment(article, lastform=None):
if not lastform:
form = CommentForm()
form.article_id = article.id
form.parent_comment_id = ''
else:
form = lastform
return {
'article': article,
'form': form
}
"""

@ -1,3 +1,3 @@
from django.test import TestCase from django.test import TestCase
# Create your tests here. # Create your tests here.

@ -74,7 +74,7 @@ class CommentPostView(FormView):
comment_cache_key = 'article_comments_{id}'.format(id=article_id) comment_cache_key = 'article_comments_{id}'.format(id=article_id)
cache.delete(comment_cache_key) cache.delete(comment_cache_key)
from django.core.cache.utils import make_template_fragment_key from django.core.cache.utils import make_template_fragment_key
username = self.request.user.username if self.request.user else '' username = self.request.user.username if self.request.user else ''
key = make_template_fragment_key('sidebar', [username]) key = make_template_fragment_key('sidebar', [username])
cache.delete(key) cache.delete(key)
return HttpResponseRedirect("%s#div-comment-%d" % (article.get_absolute_url(), comment.pk)) return HttpResponseRedirect("%s#div-comment-%d" % (article.get_absolute_url(), comment.pk))

@ -1,3 +1,22 @@
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.
from .models import OAuthUser
class OAuthUserAdmin(admin.ModelAdmin):
list_display = ('id', 'author', 'nikename', 'type', 'picture', 'email',)
list_display_links = ('id', 'nikename')
list_filter = ('author', 'type',)
admin.site.register(OAuthUser, OAuthUserAdmin)
"""
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='用户', blank=True, null=True)
openid = models.CharField(max_length=50)
nikename = models.CharField(max_length=50, verbose_name='昵称')
token = models.CharField(max_length=150)
picture = models.CharField(max_length=350, blank=True, null=True)
type = models.CharField(blank=False, null=False, max_length=50)
email = models.CharField(max_length=50, null=True, blank=True)
"""

@ -15,3 +15,7 @@ class OAuthUser(models.Model):
def __str__(self): def __str__(self):
return self.nikename return self.nikename
class Meta:
verbose_name = 'oauth用户'
verbose_name_plural = verbose_name

@ -38,11 +38,11 @@ class BaseOauthManager(metaclass=ABCMeta):
@property @property
def is_access_token_set(self): def is_access_token_set(self):
return self.access_token != None return self.access_token is not None
@property @property
def is_authorized(self): def is_authorized(self):
return self.is_access_token_set and self.access_token != None and self.openid != None return self.is_access_token_set and self.access_token is not None and self.openid is not None
@abstractmethod @abstractmethod
def get_authorization_url(self): def get_authorization_url(self):

@ -15,7 +15,7 @@ from DjangoBlog.utils import send_email, get_md5
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
from .oauthmanager import WBOauthManager, GoogleOauthManager, get_manager_by_type from .oauthmanager import get_manager_by_type
def authorize(request): def authorize(request):
@ -54,15 +54,14 @@ def authorize(request):
if not email: if not email:
# todo # todo
# 未避免用户名重复暂时使用oauth用户名+openid这种方式来创建用户 # 未避免用户名重复暂时使用oauth用户名+openid这种方式来创建用户
#author = get_user_model().objects.get_or_create(username=user.nikename + '_' + str(user.openid))[0] # author = get_user_model().objects.get_or_create(username=user.nikename + '_' + str(user.openid))[0]
#user.author = author # user.author = author
user.save() user.save()
url = reverse('oauth:require_email', kwargs= url = reverse('oauth:require_email', kwargs={
{
'oauthid': user.id 'oauthid': user.id
}) })
print(url)
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@ -138,7 +137,7 @@ class RequireEmailView(FormView):
'sign': sign 'sign': sign
}) })
url = "http://{site}{path}".format(site=site, path=path) url = "http://{site}{path}".format(site=site, path=path)
print(url)
content = """ content = """
<p>请点击下面链接绑定您的邮箱</p> <p>请点击下面链接绑定您的邮箱</p>
@ -151,56 +150,3 @@ class RequireEmailView(FormView):
""".format(url=url) """.format(url=url)
send_email('绑定您的电子邮箱', content, [email, ]) send_email('绑定您的电子邮箱', content, [email, ])
return HttpResponseRedirect('/') return HttpResponseRedirect('/')
"""
def wbauthorize(request, sitename):
manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],
client_secret=settings.OAHUTH['sina']['appsecret'],
callback_url=settings.OAHUTH['sina']['callbackurl'])
code = request.GET.get('code', None)
rsp = manager.get_access_token_by_code(code)
print(rsp)
return HttpResponse(rsp)
def wboauthurl(request):
manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],
client_secret=settings.OAHUTH['sina']['appsecret'],
callback_url=settings.OAHUTH['sina']['callbackurl'])
url = manager.get_authorization_url()
return HttpResponse(url)
def googleoauthurl(request):
manager = GoogleOauthManager()
url = manager.get_authorization_url()
return HttpResponse(url)
def googleauthorize(request):
manager = GoogleOauthManager()
code = request.GET.get('code', None)
rsp = manager.get_access_token_by_code(code)
if not rsp:
return HttpResponseRedirect(manager.get_authorization_url())
user = manager.get_oauth_userinfo()
if user:
email = user['email']
if email:
author = get_user_model().objects.get(email=email)
if not author:
author = get_user_model().objects.create_user(username=user["name"], email=email)
if not GoogleUserInfo.objects.filter(author_id=author.pk):
userinfo = GoogleUserInfo()
userinfo.author = author
userinfo.picture = user["picture"]
userinfo.token = manager.access_token
userinfo.openid = manager.openid
userinfo.nikename = user["name"]
userinfo.save()
login(request, author)
else:
pass
return HttpResponseRedirect('/')
"""

@ -1,6 +1,6 @@
{% load blog_tags %} {% load blog_tags %}
<article id="post-{{ article.pk }} " <article id="post-{{ article.pk }} "
class="post-3815 post type-post status-publish format-standard hentry"> class="post-{{ article.pk }} post type-post status-publish format-standard hentry">
<header class="entry-header"> <header class="entry-header">
<h1 class="entry-title"> <h1 class="entry-title">

Loading…
Cancel
Save