from django.shortcuts import render # Create your views here. import os import datetime from django.views.generic.list import ListView from django.views.generic.detail import DetailView from django.conf import settings from django import forms from django.http import HttpResponse from django.http import HttpResponseRedirect from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.decorators import login_required from DjangoBlog.utils import cache, logger from django.shortcuts import get_object_or_404 from blog.models import Article, Category, Tag from comments.forms import CommentForm 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, queryset=None): obj = super(ArticleDetailView, self).get_object() obj.viewed() self.object = obj return obj 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__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': response = [] for filename in request.FILES: timestr = datetime.datetime.now().strftime('%Y/%m/%d') imgextensions = ['jpg', 'png', 'jpeg', 'bmp'] fname = u''.join(str(filename)) isimage = len([i for i in imgextensions if fname.find(i) >= 0]) > 0 basepath = r'/var/www/resource/{type}/{timestr}'.format( type='files' if not isimage else'image', timestr=timestr) if settings.TESTING: basepath = settings.BASE_DIR + '/uploads' url = 'https://resource.lylinux.net/{type}/{timestr}/{filename}'.format( type='files' if not isimage else'image', timestr=timestr, filename=filename) if not os.path.exists(basepath): os.makedirs(basepath) savepath = os.path.join(basepath, filename) with open(savepath, 'wb+') as wfile: for chunk in request.FILES[filename].chunks(): wfile.write(chunk) if isimage: from PIL import Image image = Image.open(savepath) image.save(savepath, quality=20, optimize=True) response.append(url) return HttpResponse(response) 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)