from django.shortcuts import render # Create your views here. from django.views.generic.list import ListView from django.views.generic import TemplateView from django.views.decorators.cache import cache_page from django.views.generic.detail import DetailView from django.views.generic import UpdateView from django.views.generic.edit import CreateView, FormView from django.views.generic.dates import YearArchiveView, MonthArchiveView from blog.models import Article, Category, Tag from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.core.exceptions import ObjectDoesNotExist from comments.forms import CommentForm from django.conf import settings from django import forms from django import http from django.http import HttpResponse from abc import ABCMeta, abstractmethod from haystack.generic_views import SearchView from blog.forms import BlogSearchForm import datetime from django.views.decorators.csrf import csrf_exempt import os from django.contrib.auth.decorators import login_required from DjangoBlog.utils import cache, cache_decorator, logger, get_md5 from django.utils.cache import get_cache_key from django.utils.decorators import classonlymethod from django.utils.decorators import method_decorator from django.shortcuts import get_object_or_404 from django.http import HttpResponseRedirect class ArticleListView(ListView): # template_name属性用于指定使用哪个模板进行渲染 template_name = 'blog/article_index.html' # context_object_name属性用于给上下文变量取名(在模板中使用该名字) context_object_name = 'article_list' # 页面类型,分类目录或标签列表等 page_type = '' paginate_by = settings.PAGINATE_BY page_kwarg = 'page' def get_view_cache_key(self): return self.request.get['pages'] @property def page_number(self): page_kwarg = self.page_kwarg page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 return page def get_queryset_cache_key(self): """ 子类重写.获得queryset的缓存key """ raise NotImplementedError() def get_queryset_data(self): """ 子类重写.获取queryset的数据 """ raise NotImplementedError() def get_queryset_from_cache(self, cache_key): # raise NotImplementedError() value = cache.get(cache_key) if value: logger.info('get view cache.key:{key}'.format(key=cache_key)) return value else: article_list = self.get_queryset_data() cache.set(cache_key, article_list) logger.info('set view cache.key:{key}'.format(key=cache_key)) return article_list def get_queryset(self): key = self.get_queryset_cache_key() value = self.get_queryset_from_cache(key) return value class IndexView(ArticleListView): def get_queryset_data(self): article_list = Article.objects.filter(type='a', status='p') return article_list def get_queryset_cache_key(self): cache_key = 'index_{page}'.format(page=self.page_number) return cache_key class ArticleDetailView(DetailView): template_name = 'blog/article_detail.html' model = Article pk_url_kwarg = 'article_id' context_object_name = "article" def get_object(self): obj = super(ArticleDetailView, self).get_object() obj.viewed() self.object = obj return obj def dispatch(self, request, *args, **kwargs): # todo remove slug = self.kwargs['slug'] if 'slug' in self.kwargs else '' if slug: obj = super(ArticleDetailView, self).get_object() return HttpResponseRedirect(obj.get_absolute_url()) else: return super(ArticleDetailView, self).dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): articleid = int(self.kwargs[self.pk_url_kwarg]) comment_form = CommentForm() user = self.request.user if user.is_authenticated and not user.is_anonymous and user.email and user.username: comment_form.fields.update({ 'email': forms.CharField(widget=forms.HiddenInput()), 'name': forms.CharField(widget=forms.HiddenInput()), }) comment_form.fields["email"].initial = user.email comment_form.fields["name"].initial = user.username article_comments = self.object.comment_list() kwargs['form'] = comment_form kwargs['article_comments'] = article_comments 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 return super(ArticleDetailView, self).get_context_data(**kwargs) class CategoryDetailView(ArticleListView): page_type = "分类目录归档" def get_queryset_data(self): slug = self.kwargs['category_name'] category = get_object_or_404(Category, slug=slug) categoryname = category.name self.categoryname = categoryname categorynames = list(map(lambda c: c.name, category.get_sub_categorys())) # 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): slug = self.kwargs['category_name'] category = get_object_or_404(Category, slug=slug) categoryname = category.name self.categoryname = categoryname cache_key = 'category_list_{categoryname}_{page}'.format(categoryname=categoryname, page=self.page_number) return cache_key def get_context_data(self, **kwargs): categoryname = self.categoryname try: categoryname = categoryname.split('/')[-1] except: pass kwargs['page_type'] = CategoryDetailView.page_type kwargs['tag_name'] = categoryname return super(CategoryDetailView, self).get_context_data(**kwargs) class AuthorDetailView(ArticleListView): page_type = '作者文章归档' def get_queryset_cache_key(self): author_name = self.kwargs['author_name'] cache_key = 'author_{author_name}_{page}'.format(author_name=author_name, page=self.page_number) return cache_key def get_queryset_data(self): author_name = self.kwargs['author_name'] article_list = Article.objects.filter(author__username=author_name) return article_list def get_context_data(self, **kwargs): author_name = self.kwargs['author_name'] kwargs['page_type'] = AuthorDetailView.page_type kwargs['tag_name'] = author_name return super(AuthorDetailView, self).get_context_data(**kwargs) class TagListView(ListView): template_name = '' context_object_name = 'tag_list' def get_queryset(self): tags_list = [] tags = Tag.objects.all() for t in tags: t.article_set.count() class TagDetailView(ArticleListView): page_type = '分类标签归档' def get_queryset_data(self): slug = self.kwargs['tag_name'] tag = get_object_or_404(Tag, slug=slug) tag_name = tag.name self.name = tag_name article_list = Article.objects.filter(tags__name=tag_name) return article_list def get_queryset_cache_key(self): slug = self.kwargs['tag_name'] tag = get_object_or_404(Tag, slug=slug) tag_name = tag.name self.name = tag_name cache_key = 'tag_{tag_name}_{page}'.format(tag_name=tag_name, page=self.page_number) return cache_key def get_context_data(self, **kwargs): # tag_name = self.kwargs['tag_name'] tag_name = self.name kwargs['page_type'] = TagDetailView.page_type kwargs['tag_name'] = tag_name return super(TagDetailView, self).get_context_data(**kwargs) @csrf_exempt def fileupload(request): if request.method == 'POST': fname = '' timestr = datetime.datetime.now().strftime('%Y/%m/%d') basepath = os.path.join(r'/var/www/resource/image/', timestr) if not os.path.exists(basepath): os.makedirs(basepath) fname = '' for filename in request.FILES: fname = filename savepath = os.path.join(basepath, filename) with open(savepath, 'wb+') as wfile: for chunk in request.FILES[filename].chunks(): wfile.write(chunk) return HttpResponse('https://resource.lylinux.net/' + 'image/' + timestr + '/' + fname) else: return HttpResponse("only for post") @login_required def refresh_memcache(request): try: if request.user.is_superuser: from DjangoBlog.utils import cache 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)