Update views.py

master
p36kxhw2t 1 month ago
parent bd4ef294a8
commit f25862693d

@ -21,359 +21,359 @@ from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME
from djangoblog.utils import cache, get_blog_setting, get_sha256
logger = logging.getLogger(__name__)
logger = logging.getLogger(__name__) #ZNY 获取当前模块的日志记录器
class ArticleListView(ListView):
class ArticleListView(ListView): #ZNY 文章列表视图基类继承Django通用列表视图
# template_name属性用于指定使用哪个模板进行渲染
template_name = 'blog/article_index.html'
template_name = 'blog/article_index.html' #ZNY 指定使用的模板文件
# context_object_name属性用于给上下文变量取名在模板中使用该名字
context_object_name = 'article_list'
context_object_name = 'article_list' #ZNY 模板中使用的上下文变量名
# 页面类型,分类目录或标签列表等
page_type = ''
paginate_by = settings.PAGINATE_BY
page_kwarg = 'page'
link_type = LinkShowType.L
page_type = '' #ZNY 页面类型标识
paginate_by = settings.PAGINATE_BY #ZNY 每页显示的文章数量
page_kwarg = 'page' #ZNY 分页参数名称
link_type = LinkShowType.L #ZNY 链接显示类型,默认为列表页
def get_view_cache_key(self):
return self.request.get['pages']
def get_view_cache_key(self): #ZNY 获取视图缓存键方法
return self.request.get['pages'] #ZNY 从请求中获取页面参数作为缓存键
@property
def page_number(self):
page_kwarg = self.page_kwarg
page = self.kwargs.get(
def page_number(self): #ZNY 页码属性,计算当前页码
page_kwarg = self.page_kwarg #ZNY 获取分页参数名
page = self.kwargs.get( #ZNY 从URL参数、GET参数或默认值获取页码
page_kwarg) or self.request.GET.get(page_kwarg) or 1
return page
return page #ZNY 返回当前页码
def get_queryset_cache_key(self):
def get_queryset_cache_key(self): #ZNY 获取查询集缓存键方法
"""
子类重写.获得queryset的缓存key
"""
raise NotImplementedError()
raise NotImplementedError() #ZNY 要求子类必须实现此方法
def get_queryset_data(self):
def get_queryset_data(self): #ZNY 获取查询集数据方法
"""
子类重写.获取queryset的数据
"""
raise NotImplementedError()
raise NotImplementedError() #ZNY 要求子类必须实现此方法
def get_queryset_from_cache(self, cache_key):
def get_queryset_from_cache(self, cache_key): #ZNY 从缓存获取查询集方法
'''
缓存页面数据
:param cache_key: 缓存key
:return:
'''
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):
value = cache.get(cache_key) #ZNY 尝试从缓存获取数据
if value: #ZNY 如果缓存存在
logger.info('get view cache.key:{key}'.format(key=cache_key)) #ZNY 记录缓存命中日志
return value #ZNY 返回缓存数据
else: #ZNY 如果缓存不存在
article_list = self.get_queryset_data() #ZNY 从数据库获取数据
cache.set(cache_key, article_list) #ZNY 将数据存入缓存
logger.info('set view cache.key:{key}'.format(key=cache_key)) #ZNY 记录缓存设置日志
return article_list #ZNY 返回数据
def get_queryset(self): #ZNY 重写获取查询集方法
'''
重写默认从缓存获取数据
:return:
'''
key = self.get_queryset_cache_key()
value = self.get_queryset_from_cache(key)
return value
key = self.get_queryset_cache_key() #ZNY 获取缓存键
value = self.get_queryset_from_cache(key) #ZNY 从缓存获取数据
return value #ZNY 返回查询集
def get_context_data(self, **kwargs):
kwargs['linktype'] = self.link_type
return super(ArticleListView, self).get_context_data(**kwargs)
def get_context_data(self, **kwargs): #ZNY 获取上下文数据方法
kwargs['linktype'] = self.link_type #ZNY 添加链接类型到上下文
return super(ArticleListView, self).get_context_data(**kwargs) #ZNY 调用父类方法
class IndexView(ArticleListView):
class IndexView(ArticleListView): #ZNY 首页视图,继承文章列表视图
'''
首页
'''
# 友情链接类型
link_type = LinkShowType.I
link_type = LinkShowType.I #ZNY 设置链接显示类型为首页
def get_queryset_data(self):
article_list = Article.objects.filter(type='a', status='p')
return article_list
def get_queryset_data(self): #ZNY 实现获取查询集数据方法
article_list = Article.objects.filter(type='a', status='p') #ZNY 获取所有已发布的普通文章
return article_list #ZNY 返回文章列表
def get_queryset_cache_key(self):
cache_key = 'index_{page}'.format(page=self.page_number)
return cache_key
def get_queryset_cache_key(self): #ZNY 实现获取查询集缓存键方法
cache_key = 'index_{page}'.format(page=self.page_number) #ZNY 生成首页缓存键,包含页码
return cache_key #ZNY 返回缓存键
class ArticleDetailView(DetailView):
class ArticleDetailView(DetailView): #ZNY 文章详情视图继承Django通用详情视图
'''
文章详情页面
'''
template_name = 'blog/article_detail.html'
model = Article
pk_url_kwarg = 'article_id'
context_object_name = "article"
def get_context_data(self, **kwargs):
comment_form = CommentForm()
article_comments = self.object.comment_list()
parent_comments = article_comments.filter(parent_comment=None)
blog_setting = get_blog_setting()
paginator = Paginator(parent_comments, blog_setting.article_comment_count)
page = self.request.GET.get('comment_page', '1')
if not page.isnumeric():
page = 1
else:
page = int(page)
if page < 1:
page = 1
if page > paginator.num_pages:
page = paginator.num_pages
p_comments = paginator.page(page)
next_page = p_comments.next_page_number() if p_comments.has_next() else None
prev_page = p_comments.previous_page_number() if p_comments.has_previous() else None
if next_page:
kwargs[
template_name = 'blog/article_detail.html' #ZNY 指定详情页模板
model = Article #ZNY 指定模型类
pk_url_kwarg = 'article_id' #ZNY URL中的主键参数名
context_object_name = "article" #ZNY 模板中使用的上下文变量名
def get_context_data(self, **kwargs): #ZNY 重写获取上下文数据方法
comment_form = CommentForm() #ZNY 创建评论表单实例
article_comments = self.object.comment_list() #ZNY 获取文章评论列表
parent_comments = article_comments.filter(parent_comment=None) #ZNY 获取顶级评论(无父评论)
blog_setting = get_blog_setting() #ZNY 获取博客设置
paginator = Paginator(parent_comments, blog_setting.article_comment_count) #ZNY 创建评论分页器
page = self.request.GET.get('comment_page', '1') #ZNY 获取评论页码默认为1
if not page.isnumeric(): #ZNY 如果页码不是数字
page = 1 #ZNY 设置为第一页
else: #ZNY 如果是数字
page = int(page) #ZNY 转换为整数
if page < 1: #ZNY 如果页码小于1
page = 1 #ZNY 设置为第一页
if page > paginator.num_pages: #ZNY 如果页码大于总页数
page = paginator.num_pages #ZNY 设置为最后一页
p_comments = paginator.page(page) #ZNY 获取指定页的评论
next_page = p_comments.next_page_number() if p_comments.has_next() else None #ZNY 计算下一页页码
prev_page = p_comments.previous_page_number() if p_comments.has_previous() else None #ZNY 计算上一页页码
if next_page: #ZNY 如果存在下一页
kwargs[ #ZNY 设置下一页评论URL
'comment_next_page_url'] = self.object.get_absolute_url() + f'?comment_page={next_page}#commentlist-container'
if prev_page:
kwargs[
if prev_page: #ZNY 如果存在上一页
kwargs[ #ZNY 设置上一页评论URL
'comment_prev_page_url'] = self.object.get_absolute_url() + f'?comment_page={prev_page}#commentlist-container'
kwargs['form'] = comment_form
kwargs['article_comments'] = article_comments
kwargs['p_comments'] = p_comments
kwargs['comment_count'] = len(
kwargs['form'] = comment_form #ZNY 添加评论表单到上下文
kwargs['article_comments'] = article_comments #ZNY 添加所有评论到上下文
kwargs['p_comments'] = p_comments #ZNY 添加分页评论到上下文
kwargs['comment_count'] = len( #ZNY 添加评论总数到上下文
article_comments) if article_comments else 0
kwargs['next_article'] = self.object.next_article
kwargs['prev_article'] = self.object.prev_article
kwargs['next_article'] = self.object.next_article #ZNY 添加下一篇文章到上下文
kwargs['prev_article'] = self.object.prev_article #ZNY 添加上一篇文章到上下文
context = super(ArticleDetailView, self).get_context_data(**kwargs)
article = self.object
context = super(ArticleDetailView, self).get_context_data(**kwargs) #ZNY 调用父类方法获取基础上下文
article = self.object #ZNY 获取当前文章对象
# Action Hook, 通知插件"文章详情已获取"
hooks.run_action('after_article_body_get', article=article, request=self.request)
hooks.run_action('after_article_body_get', article=article, request=self.request) #ZNY 执行文章内容获取后的动作钩子
# # Filter Hook, 允许插件修改文章正文
article.body = hooks.apply_filters(ARTICLE_CONTENT_HOOK_NAME, article.body, article=article,
article.body = hooks.apply_filters(ARTICLE_CONTENT_HOOK_NAME, article.body, article=article, #ZNY 应用文章内容过滤器
request=self.request)
return context
return context #ZNY 返回完整的上下文数据
class CategoryDetailView(ArticleListView):
class CategoryDetailView(ArticleListView): #ZNY 分类详情视图,继承文章列表视图
'''
分类目录列表
'''
page_type = "分类目录归档"
page_type = "分类目录归档" #ZNY 设置页面类型
def get_queryset_data(self):
slug = self.kwargs['category_name']
category = get_object_or_404(Category, slug=slug)
def get_queryset_data(self): #ZNY 实现获取查询集数据方法
slug = self.kwargs['category_name'] #ZNY 从URL参数获取分类slug
category = get_object_or_404(Category, slug=slug) #ZNY 获取分类对象不存在则404
categoryname = category.name
self.categoryname = categoryname
categorynames = list(
categoryname = category.name #ZNY 获取分类名称
self.categoryname = categoryname #ZNY 保存分类名称到实例变量
categorynames = list( #ZNY 获取所有子分类名称列表
map(lambda c: c.name, category.get_sub_categorys()))
article_list = Article.objects.filter(
article_list = Article.objects.filter( #ZNY 获取该分类及其子分类下的所有已发布文章
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(
return article_list #ZNY 返回文章列表
def get_queryset_cache_key(self): #ZNY 实现获取查询集缓存键方法
slug = self.kwargs['category_name'] #ZNY 从URL参数获取分类slug
category = get_object_or_404(Category, slug=slug) #ZNY 获取分类对象
categoryname = category.name #ZNY 获取分类名称
self.categoryname = categoryname #ZNY 保存分类名称到实例变量
cache_key = 'category_list_{categoryname}_{page}'.format( #ZNY 生成分类缓存键
categoryname=categoryname, page=self.page_number)
return cache_key
return cache_key #ZNY 返回缓存键
def get_context_data(self, **kwargs):
def get_context_data(self, **kwargs): #ZNY 重写获取上下文数据方法
categoryname = self.categoryname
categoryname = self.categoryname #ZNY 获取分类名称
try:
categoryname = categoryname.split('/')[-1]
categoryname = categoryname.split('/')[-1] #ZNY 尝试获取分类路径的最后一部分
except BaseException:
pass
kwargs['page_type'] = CategoryDetailView.page_type
kwargs['tag_name'] = categoryname
return super(CategoryDetailView, self).get_context_data(**kwargs)
pass #ZNY 如果出错则忽略
kwargs['page_type'] = CategoryDetailView.page_type #ZNY 添加页面类型到上下文
kwargs['tag_name'] = categoryname #ZNY 添加分类名称到上下文
return super(CategoryDetailView, self).get_context_data(**kwargs) #ZNY 调用父类方法
class AuthorDetailView(ArticleListView):
class AuthorDetailView(ArticleListView): #ZNY 作者详情视图,继承文章列表视图
'''
作者详情页
'''
page_type = '作者文章归档'
page_type = '作者文章归档' #ZNY 设置页面类型
def get_queryset_cache_key(self):
from uuslug import slugify
author_name = slugify(self.kwargs['author_name'])
cache_key = 'author_{author_name}_{page}'.format(
def get_queryset_cache_key(self): #ZNY 实现获取查询集缓存键方法
from uuslug import slugify #ZNY 导入slugify函数
author_name = slugify(self.kwargs['author_name']) #ZNY 对作者名称进行slugify处理
cache_key = 'author_{author_name}_{page}'.format( #ZNY 生成作者缓存键
author_name=author_name, page=self.page_number)
return cache_key
return cache_key #ZNY 返回缓存键
def get_queryset_data(self):
author_name = self.kwargs['author_name']
article_list = Article.objects.filter(
def get_queryset_data(self): #ZNY 实现获取查询集数据方法
author_name = self.kwargs['author_name'] #ZNY 从URL参数获取作者名称
article_list = Article.objects.filter( #ZNY 获取该作者的所有已发布普通文章
author__username=author_name, type='a', status='p')
return article_list
return article_list #ZNY 返回文章列表
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)
def get_context_data(self, **kwargs): #ZNY 重写获取上下文数据方法
author_name = self.kwargs['author_name'] #ZNY 获取作者名称
kwargs['page_type'] = AuthorDetailView.page_type #ZNY 添加页面类型到上下文
kwargs['tag_name'] = author_name #ZNY 添加作者名称到上下文
return super(AuthorDetailView, self).get_context_data(**kwargs) #ZNY 调用父类方法
class TagDetailView(ArticleListView):
class TagDetailView(ArticleListView): #ZNY 标签详情视图,继承文章列表视图
'''
标签列表页面
'''
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(
page_type = '分类标签归档' #ZNY 设置页面类型
def get_queryset_data(self): #ZNY 实现获取查询集数据方法
slug = self.kwargs['tag_name'] #ZNY 从URL参数获取标签slug
tag = get_object_or_404(Tag, slug=slug) #ZNY 获取标签对象不存在则404
tag_name = tag.name #ZNY 获取标签名称
self.name = tag_name #ZNY 保存标签名称到实例变量
article_list = Article.objects.filter( #ZNY 获取该标签下的所有已发布普通文章
tags__name=tag_name, type='a', status='p')
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(
return article_list #ZNY 返回文章列表
def get_queryset_cache_key(self): #ZNY 实现获取查询集缓存键方法
slug = self.kwargs['tag_name'] #ZNY 从URL参数获取标签slug
tag = get_object_or_404(Tag, slug=slug) #ZNY 获取标签对象
tag_name = tag.name #ZNY 获取标签名称
self.name = tag_name #ZNY 保存标签名称到实例变量
cache_key = 'tag_{tag_name}_{page}'.format( #ZNY 生成标签缓存键
tag_name=tag_name, page=self.page_number)
return cache_key
return cache_key #ZNY 返回缓存键
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)
def get_context_data(self, **kwargs): #ZNY 重写获取上下文数据方法
# tag_name = self.kwargs['tag_name'] #ZNY 注释掉的获取标签名称方式
tag_name = self.name #ZNY 从实例变量获取标签名称
kwargs['page_type'] = TagDetailView.page_type #ZNY 添加页面类型到上下文
kwargs['tag_name'] = tag_name #ZNY 添加标签名称到上下文
return super(TagDetailView, self).get_context_data(**kwargs) #ZNY 调用父类方法
class ArchivesView(ArticleListView):
class ArchivesView(ArticleListView): #ZNY 文章归档视图,继承文章列表视图
'''
文章归档页面
'''
page_type = '文章归档'
paginate_by = None
page_kwarg = None
template_name = 'blog/article_archives.html'
page_type = '文章归档' #ZNY 设置页面类型
paginate_by = None #ZNY 不分页
page_kwarg = None #ZNY 无分页参数
template_name = 'blog/article_archives.html' #ZNY 指定归档页面模板
def get_queryset_data(self):
return Article.objects.filter(status='p').all()
def get_queryset_data(self): #ZNY 实现获取查询集数据方法
return Article.objects.filter(status='p').all() #ZNY 获取所有已发布文章
def get_queryset_cache_key(self):
cache_key = 'archives'
return cache_key
def get_queryset_cache_key(self): #ZNY 实现获取查询集缓存键方法
cache_key = 'archives' #ZNY 归档页面使用固定缓存键
return cache_key #ZNY 返回缓存键
class LinkListView(ListView):
model = Links
template_name = 'blog/links_list.html'
class LinkListView(ListView): #ZNY 友情链接列表视图继承Django通用列表视图
model = Links #ZNY 指定模型类
template_name = 'blog/links_list.html' #ZNY 指定模板文件
def get_queryset(self):
return Links.objects.filter(is_enable=True)
def get_queryset(self): #ZNY 重写获取查询集方法
return Links.objects.filter(is_enable=True) #ZNY 只返回启用的友情链接
class EsSearchView(SearchView):
def get_context(self):
paginator, page = self.build_page()
context = {
"query": self.query,
"form": self.form,
"page": page,
"paginator": paginator,
"suggestion": None,
class EsSearchView(SearchView): #ZNY Elasticsearch搜索视图继承Haystack搜索视图
def get_context(self): #ZNY 重写获取上下文方法
paginator, page = self.build_page() #ZNY 构建分页
context = { #ZNY 构建上下文字典
"query": self.query, #ZNY 搜索查询词
"form": self.form, #ZNY 搜索表单
"page": page, #ZNY 当前页
"paginator": paginator, #ZNY 分页器
"suggestion": None, #ZNY 搜索建议初始为None
}
if hasattr(self.results, "query") and self.results.query.backend.include_spelling:
context["suggestion"] = self.results.query.get_spelling_suggestion()
context.update(self.extra_context())
if hasattr(self.results, "query") and self.results.query.backend.include_spelling: #ZNY 如果支持拼写建议
context["suggestion"] = self.results.query.get_spelling_suggestion() #ZNY 获取拼写建议
context.update(self.extra_context()) #ZNY 更新额外上下文
return context
return context #ZNY 返回完整上下文
@csrf_exempt
def fileupload(request):
@csrf_exempt #ZNY 免除CSRF保护
def fileupload(request): #ZNY 文件上传视图函数
"""
该方法需自己写调用端来上传图片该方法仅提供图床功能
:param request:
:return:
"""
if request.method == 'POST':
sign = request.GET.get('sign', None)
if not sign:
return HttpResponseForbidden()
if not sign == get_sha256(get_sha256(settings.SECRET_KEY)):
return HttpResponseForbidden()
response = []
for filename in request.FILES:
timestr = timezone.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
base_dir = os.path.join(settings.STATICFILES, "files" if not isimage else "image", timestr)
if not os.path.exists(base_dir):
os.makedirs(base_dir)
savepath = os.path.normpath(os.path.join(base_dir, f"{uuid.uuid4().hex}{os.path.splitext(filename)[-1]}"))
if not savepath.startswith(base_dir):
return HttpResponse("only for post")
with open(savepath, 'wb+') as wfile:
for chunk in request.FILES[filename].chunks():
if request.method == 'POST': #ZNY 只处理POST请求
sign = request.GET.get('sign', None) #ZNY 从GET参数获取签名
if not sign: #ZNY 如果没有签名
return HttpResponseForbidden() #ZNY 返回403禁止访问
if not sign == get_sha256(get_sha256(settings.SECRET_KEY)): #ZNY 验证签名是否正确
return HttpResponseForbidden() #ZNY 签名错误返回403
response = [] #ZNY 初始化响应列表
for filename in request.FILES: #ZNY 遍历所有上传的文件
timestr = timezone.now().strftime('%Y/%m/%d') #ZNY 生成时间目录字符串
imgextensions = ['jpg', 'png', 'jpeg', 'bmp'] #ZNY 图片扩展名列表
fname = u''.join(str(filename)) #ZNY 获取文件名
isimage = len([i for i in imgextensions if fname.find(i) >= 0]) > 0 #ZNY 判断是否为图片文件
base_dir = os.path.join(settings.STATICFILES, "files" if not isimage else "image", timestr) #ZNY 构建保存目录
if not os.path.exists(base_dir): #ZNY 如果目录不存在
os.makedirs(base_dir) #ZNY 创建目录
savepath = os.path.normpath(os.path.join(base_dir, f"{uuid.uuid4().hex}{os.path.splitext(filename)[-1]}")) #ZNY 生成保存路径使用UUID作为文件名
if not savepath.startswith(base_dir): #ZNY 安全检查,确保路径在指定目录内
return HttpResponse("only for post") #ZNY 路径非法返回错误
with open(savepath, 'wb+') as wfile: #ZNY 打开文件进行写入
for chunk in request.FILES[filename].chunks(): #ZNY 分块写入文件
wfile.write(chunk)
if isimage:
from PIL import Image
image = Image.open(savepath)
image.save(savepath, quality=20, optimize=True)
url = static(savepath)
response.append(url)
return HttpResponse(response)
if isimage: #ZNY 如果是图片文件
from PIL import Image #ZNY 导入PIL库
image = Image.open(savepath) #ZNY 打开图片
image.save(savepath, quality=20, optimize=True) #ZNY 压缩图片并保存
url = static(savepath) #ZNY 生成静态文件URL
response.append(url) #ZNY 将URL添加到响应列表
return HttpResponse(response) #ZNY 返回URL列表
else:
return HttpResponse("only for post")
else: #ZNY 非POST请求
return HttpResponse("only for post") #ZNY 返回只支持POST请求
def page_not_found_view(
def page_not_found_view( #ZNY 404页面未找到视图
request,
exception,
template_name='blog/error_page.html'):
if exception:
logger.error(exception)
url = request.get_full_path()
return render(request,
if exception: #ZNY 如果有异常信息
logger.error(exception) #ZNY 记录错误日志
url = request.get_full_path() #ZNY 获取请求的完整路径
return render(request, #ZNY 渲染错误页面
template_name,
{'message': _('Sorry, the page you requested is not found, please click the home page to see other?'),
'statuscode': '404'},
status=404)
'statuscode': '404'}, #ZNY 错误消息和状态码
status=404) #ZNY 返回404状态码
def server_error_view(request, template_name='blog/error_page.html'):
return render(request,
def server_error_view(request, template_name='blog/error_page.html'): #ZNY 500服务器错误视图
return render(request, #ZNY 渲染错误页面
template_name,
{'message': _('Sorry, the server is busy, please click the home page to see other?'),
'statuscode': '500'},
status=500)
'statuscode': '500'}, #ZNY 错误消息和状态码
status=500) #ZNY 返回500状态码
def permission_denied_view(
def permission_denied_view( #ZNY 403权限拒绝视图
request,
exception,
template_name='blog/error_page.html'):
if exception:
logger.error(exception)
return render(
if exception: #ZNY 如果有异常信息
logger.error(exception) #ZNY 记录错误日志
return render( #ZNY 渲染错误页面
request, template_name, {
'message': _('Sorry, you do not have permission to access this page?'),
'statuscode': '403'}, status=403)
'statuscode': '403'}, status=403) #ZNY 错误消息和状态码返回403状态码
def clean_cache_view(request):
cache.clear()
return HttpResponse('ok')
def clean_cache_view(request): #ZNY 清理缓存视图
cache.clear() #ZNY 清除所有缓存
return HttpResponse('ok') #ZNY 返回成功响应
Loading…
Cancel
Save