前言:  我看很多资料使用celery, 定时任务去执行首页静态化,  觉得博客基本都是自己修改内容,  首页基本不会经常发生变化.也不需要定时更新静态文件,  所以就没有采用celery.

 可以瞅瞅地址:  ​博客地址​

以下是我想到的实现方法思路如下:

1、根据文章 id,生成该文章的静态文件名称;

2、静态文件名配上它存放的路径;

3、判断此文章是否已静态化,如没有,则静态化

   i)取文章数据、首页数据等其它数据;

  ii)将取出的数据渲染到模板中;

  iii)将生成的文章内容写到静态文件中去

4、根据request,访问生成的静态文件

5、管理员登录修改增加删除文章需要自动生成静态文件

 

由于首页详情页都做成了静态页面导致游客所在地天气出现了死数据无法实时获取, 为了解决这个问题.

博客优化-django静态页面处理_html

采用Ajax异步请求数据在展示 

请忽视我前端代码有点low, 这里只是提出解决思路

//    天气ajax请求
// {'last_update': '15:09', 'city': '北京', 'text': '晴', 'code': '0', 'temperature': '27'}
$.ajax({
type: "GET",
dataType: "JSON",
url: '/weather',
success: function (result) {
var code = result["code"];
var div_img = document.createElement("div");
div_img.className = "div_img";
div_img.style.cssText = "width: 48px; height: 48px; background-size: 100% 100%; background-repeat: no-repeat; margin: 0 auto;";
div_img.style.backgroundImage = "url(/root_static/img/black/" + code + "@1x.png)";

$("#weather_img").append(div_img);
var span_1 = document.createElement("span");
span_1.innerText = result['city'];
var span_2 = document.createElement("span");
span_2.innerText = result['text'];
$(".weather_city").append(span_1, "<br>", span_2);

var div_temperature = document.createElement("div");
div_temperature.style.cssText = "height: 48px; width: 75px; font-size:40px; text-align:center; margin: 0 auto;line-height: 60px;";
div_temperature.innerText = result['temperature'] + "°";

var div_last_update = document.createElement("div");
div_last_update.style.cssText = "line-height: 50px;";
div_last_update.innerText = "更新于" + result['last_update'];
$(".weather_num").append(div_temperature, div_last_update);
},
error: function () {
alert("获取天气api失败");
}
});

 

为了解决管理员登录修改增加删除文章需要自动生成静态文件

这里需要重写下面三个方法  save_model    delete_model  delete_queryset

admin.py 代码 

# Register your models here.
import os

from django.contrib import admin
from django.template.loader import render_to_string
from pure_pagination import Paginator

from blogproject.settings import BASE_DIR
from user.models import UserProfile

from .models import Post, Category, Tag, Comments, BookMark, Bulletin, FriendLink


class BasesAction(admin.ModelAdmin):
"""重写adminModel模型方法"""

@staticmethod
def writeIndexStaticHTML():
"""将首页静态化 => html写入指定目录 用于前端展示"""

post_list = Post.objects.all().order_by('-top', '-modified_time')
post_list = Paginator(post_list, 5).page(1)
content = render_to_string('blog/index.html', context={'page_obj': post_list})
with open(os.path.join(BASE_DIR, 'templates/static/index.html'), 'w', encoding="utf-8") as f:
f.write(content)

def save_model(self, request, obj, form, change):
super(BasesAction, self).save_model(request, obj, form, change)
BasesAction.writeIndexStaticHTML()

def delete_model(self, request, obj):
super().delete_model(request, obj)
BasesAction.writeIndexStaticHTML()

def delete_queryset(self, request, queryset):
super(BasesAction, self).delete_queryset(request, queryset)
BasesAction.writeIndexStaticHTML()


class PostAdmin(BasesAction):
list_display = ['title', 'created_time', 'modified_time', 'category', 'author', 'top']

@staticmethod
def writeDetailStaticHTML(pk):
"""
将详情页面静态化 => html写入指定目录 用于前端展示
:param pk: 详情文章id
"""
from django.shortcuts import get_object_or_404
post = get_object_or_404(Post, pk=pk)
# 获取评论
comments = Comments.objects.filter(new_id=pk).order_by('created_time')

context = {
'post': post, 'comments': comments, 'is_superuser': False, 'is_login': False, 'username': None, 'img': ''
}
content = render_to_string('blog/detail.html', context=context)
with open(os.path.join(BASE_DIR, 'templates/static/detail/{}.html'.format(pk)), 'w', encoding="utf-8") as f:
f.write(content)
return content

@staticmethod
def deleteStaticHTML(queryset=None, pk=None):
"""
删除静态html
:param queryset: 详情文章list对象
:param pk: 单个详情文章id
"""
if pk:
static_file = os.path.join(BASE_DIR, 'templates/static/detail/{}.html'.format(pk))
if not os.path.exists(static_file):
os.remove(static_file)
if not queryset:
return
for obj in queryset:
static_file = os.path.join(BASE_DIR, 'templates/static/detail/{}.html'.format(obj.id))
if os.path.exists(static_file):
os.remove(static_file)

def save_model(self, request, obj, form, change):
super(PostAdmin, self).save_model(request, obj, form, change)
PostAdmin.writeDetailStaticHTML(pk=obj.id)

def delete_model(self, request, obj):
PostAdmin.deleteStaticHTML(pk=obj.id)
super(PostAdmin, self).delete_model(request, obj)

def delete_queryset(self, request, queryset):
PostAdmin.deleteStaticHTML(queryset=queryset)
super(PostAdmin, self).delete_queryset(request, queryset)


admin.site.register(Post, PostAdmin)
...
...
...
admin.site.register(FriendLink, BasesAction)

资料:

​Django 生成静态页面​

​django开发的网站优化:页面静态化+数据缓存​