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

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 django.conf import settings
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.models import User
from django.contrib.sites.models import Site
@ -44,7 +44,7 @@ class DjangoBlogFeed(Feed):
return item.title
def item_description(self, item):
return common_markdown.get_markdown(item.body)
return CommonMarkdown.get_markdown(item.body)
def feed_copyright(self):
# print(Site.objects.get_current().name)

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

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

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

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

@ -3,19 +3,8 @@ from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.core.urlresolvers import reverse
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):
nickname = models.CharField('昵称', max_length=50, blank=True)

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

@ -15,7 +15,7 @@
from django.core.management.base import BaseCommand, CommandError
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
site = Site.objects.get_current().domain
@ -50,5 +50,5 @@ class Command(BaseCommand):
urls.append(self.get_full_url(url))
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'))

@ -2,7 +2,7 @@ from django.db import models
from django.core.urlresolvers import reverse
from django.conf import settings
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 DjangoBlog.utils import cache_decorator, logger, cache
from django.utils.functional import cached_property
@ -22,7 +22,7 @@ class BaseModel(models.Model):
return
try:
notify_url = self.get_full_url()
spider_notify.baidu_notify([notify_url])
SpiderNotify.baidu_notify([notify_url])
except Exception as ex:
logger.error("notify sipder", ex)
print(ex)
@ -75,8 +75,7 @@ class Article(BaseModel):
def get_absolute_url(self):
return reverse('blog:detail', kwargs=
{
return reverse('blog:detail', kwargs={
'article_id': self.id,
'year': self.created_time.year,
'month': self.created_time.month,
@ -86,14 +85,9 @@ class Article(BaseModel):
@cache_decorator(60 * 60 * 10)
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
def save(self, *args, **kwargs):
@ -159,6 +153,43 @@ class Category(BaseModel):
def __str__(self):
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):
"""文章标签"""

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

@ -51,8 +51,8 @@ def datetimeformat(data):
@register.filter(is_safe=True)
@stringfilter
def custom_markdown(content):
from DjangoBlog.utils import common_markdown
return mark_safe(common_markdown.get_markdown(content))
from DjangoBlog.utils import CommonMarkdown
return mark_safe(CommonMarkdown.get_markdown(content))
@register.filter(is_safe=True)
@ -228,7 +228,7 @@ def gravatar_url(email, size=40):
"""获得gravatar头像"""
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" % (
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)
"""
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.save()
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['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['prev_article'] = self.object.prev_article
@ -137,9 +137,13 @@ class CategoryDetailView(ArticleListView):
def get_queryset_data(self):
slug = self.kwargs['category_name']
category = get_object_or_404(Category, slug=slug)
categoryname = category.name
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
def get_queryset_cache_key(self):
@ -247,28 +251,11 @@ def refresh_memcache(request):
if request.user.is_superuser:
from DjangoBlog.utils import cache
if cache != None: cache.clear()
if cache and cache is not None:
cache.clear()
return HttpResponse("ok")
else:
from django.http import HttpResponseForbidden
return HttpResponseForbidden()
except Exception as 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
"""
return HttpResponse(e)

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

@ -30,7 +30,6 @@ def parse_commenttree(commentlist, comment):
datas = []
def parse(c):
childs = commentlist.filter(parent_comment=c)
for child in childs:
datas.append(child)
@ -43,31 +42,8 @@ def parse_commenttree(commentlist, comment):
@register.inclusion_tag('comments/tags/comment_item.html')
def show_comment_item(comment, ischild):
"""评论"""
depth = 1 if ischild else 2;
depth = 1 if ischild else 2
return {
'comment_item': comment,
'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
# 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)
cache.delete(comment_cache_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])
cache.delete(key)
return HttpResponseRedirect("%s#div-comment-%d" % (article.get_absolute_url(), comment.pk))

@ -1,3 +1,22 @@
from django.contrib import admin
# 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):
return self.nikename
class Meta:
verbose_name = 'oauth用户'
verbose_name_plural = verbose_name

@ -38,11 +38,11 @@ class BaseOauthManager(metaclass=ABCMeta):
@property
def is_access_token_set(self):
return self.access_token != None
return self.access_token is not None
@property
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
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.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponseForbidden
from .oauthmanager import WBOauthManager, GoogleOauthManager, get_manager_by_type
from .oauthmanager import get_manager_by_type
def authorize(request):
@ -54,15 +54,14 @@ def authorize(request):
if not email:
# todo
# 未避免用户名重复暂时使用oauth用户名+openid这种方式来创建用户
#author = get_user_model().objects.get_or_create(username=user.nikename + '_' + str(user.openid))[0]
#user.author = author
# author = get_user_model().objects.get_or_create(username=user.nikename + '_' + str(user.openid))[0]
# user.author = author
user.save()
url = reverse('oauth:require_email', kwargs=
{
url = reverse('oauth:require_email', kwargs={
'oauthid': user.id
})
print(url)
return HttpResponseRedirect(url)
@ -138,7 +137,7 @@ class RequireEmailView(FormView):
'sign': sign
})
url = "http://{site}{path}".format(site=site, path=path)
print(url)
content = """
<p>请点击下面链接绑定您的邮箱</p>
@ -151,56 +150,3 @@ class RequireEmailView(FormView):
""".format(url=url)
send_email('绑定您的电子邮箱', content, [email, ])
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 %}
<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">
<h1 class="entry-title">

Loading…
Cancel
Save