一 . 什么是页面静态化
一般来说,用户访问一个页面,服务器对应的视图模块会从数据库取出数据并且渲染到对应的模板文件中,最后再返回给用户,每个用户都经历这样的一个过程,如果成千上万的用户访问,那服务器的压力显而易见会很大;如果我们把用户访问频繁的页面做成一个静态的页面,然后用户每次访问的这个页面,那么服务器的压力不就大大的减少了?举个例子,一分钟之内,有500个用户访问了首页,首页的数据要从数据库中查2次,则总共需要查询数据库1000次;将页面静态化后,同种情况,只需要在第一个用户访问的时候查询2次数据库然后生成一个静态页面,后续的用户都访问该页面,相比之下,服务器的压力大大的减少了
页面静态化即将动态渲染生成的页面结果保存成html文件,放到静态文件服务器中。用户访问的时候访问的直接是处理好之后的html静态文件。 对于页面中属于每个用户展示不同数据内容的部分,可以在用户请求完静态化之后的页面后,在页面中向后端发送请求,获取属于用户的特殊的数据
二. 页面静态化的流程
生成静态的html文件 --> 配置文件中添加保存静态文件的目录 --> 配置模板目录 --> 模板目录中新建index.html模板文件
PS:Django中
-
生成静态的html文件
... import os from django.conf import settings from django.template import loader # 将渲染到模板的数据content准备好后 template = loader.get_template('index.html') html_text = template.render(context) file_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR, 'index.html') with open(file_path, 'w', encoding='utf-8') as f: f.write(html_text)
-
配置文件中添加保存静态文件的目录
GENERATED_STATIC_HTML_FILES_DIR = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'front')
-
配置模板目录
... 'DIRS': [os.path.join(BASE_DIR, 'templates')], ...
-
模板目录中新建index.html模板文件
三. 静态页面生成之添加定时任务
对于一些数据频繁更新的页面,使用定时任务每隔一段时间重新生成页面
-
安装
pip install django-crontab
-
添加应用
INSTALLED_APPS = [ ... 'django_crontab', # 定时任务 ... ]
-
设置任务的定时时间
-
在配置文件中设置定时执行的时间
-
每个定时任务分为三部分定义:
-
任务时间
基本格式 :* * * * * 分 时 日 月 周 命令 M: 分钟(0-59)。每分钟用*或者 */1表示 H:小时(0-23)。(0表示0点) D:天(1-31)。 m: 月(1-12)。 d: 一星期内的天(0~6,0为星期天)。
-
任务方法
-
任务日志
-
-
首页的定时任务设置如下
# 定时任务 CRONJOBS = [ # 每5分钟执行一次生成主页静态文件 ('*/5 * * * *', 'contents.crons.generate_static_index_html', '>> /Users/Jaho/Desktop/jaho/logs/crontab.log') ]
-
解决crontab中文问题
CRONTAB_COMMAND_PREFIX = 'LANG_ALL=zh_cn.UTF-8'
-
开启定时任务
python manage.py crontab add
-
显示已经激活的定时任务
python manage.py crontab show
-
移除定时任务
python manage.py crontab remove
-
静态化首页的手动脚本
#!/usr/bin/env python """ 功能:手动生成所有SKU的静态detail html文件 使用方法: ./regenerate_index_html.py """ import sys sys.path.insert(0, '../') import os if not os.getenv('DJANGO_SETTINGS_MODULE'): os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev' # 让django进行初始化设置 import django django.setup() 导入静态页面的方法 if __name__ == '__main__': # 生成静态页面的方法
四. 静态页面生成之异步队列
对于一些数据更新不是很频繁的页面,当管理员修改页面对应数据表的数据时重新生成页面
- 可以将生成页面的函数放置于Celery任务队列 ,然后在管理员修改页面的视图中发送任务即可
好处
- 提高了访问的速度,不需要去访问数据库,或者缓存来获取哪些数据,浏览器直接加载渲染html页即可。所以可以大大的提高访问效率;
- 从网站优化来分析,搜索引擎更喜欢静态的网页,静态网页与动态网页相比,搜索引擎更喜欢静的,更便于抓取,搜索引擎SEO排名更容易提高。
- 从安全角度讲,静态网页不宜遭到黑客攻击,如果黑客不知道你网站的后台、网站采用程序、数据库的地址,静态网页, 更不容易受到黑客的攻击。
- 从网站稳定性来讲,如果程序、数据库出了问题,会直接影响网站的访问,而静态网页就避免了如此情况,不会因为程序等,而损失网站数据,影响正常打开,损失用户体验,影响网站信任度。
缺点
静态页面多的时候会占用空间
Summary
虽然页面增多会占用更多的服务器空间,但是以空间换时间,提高网站的访问速度,提升用户的体验,还是非常的值得的,毕竟空间这东西,有钱就可以解决了
如若有误,欢迎指出,感谢!
网友评论