每日分享
Never let success get to your head, and never let failure get to your heart.
『胜不骄,败不馁』(直译:永远不要将成功顶到你的头上,永远不要让失败放进你的心。)
小闫语录:
真正的强者不会将失败放在心上,从此一蹶不振;同样,也不会将一时的成功永远顶在头顶,活在以往。胜败乃兵家常事,顺其自然,不要过分的放大成功与失败本身,它们与普通的事件一样,只是因为我们对待的态度才变得那么强大或者可怕。
美多商城项目(六)
1.提醒
- 接口文档是后端写完接口之后给前端使用的,一定要写的尽可能详细。
- 学过的内容要经常回顾,代码要经常敲,要不然会『相望不相识』
- 序列化器相当于为我们封装了一些常用的功能,减少我们的工作,超重要,一定要经常回顾,重点掌握。
2.docker
1.交互式容器只要exit退出后,就停止了。如果是想要在后台长期运行,那么可以创建守护式容器,不会随着exit退出而停止。
2.交互式容器创建完会自动进入,但是守护式容器创建完之后不会自动进入,需要手动添加命令:
docker exec -it myubuntu2 /bin/bash
2.1容器操作命令总结
1.创建一个交互式容器
docker run -i --name=<容器名> <镜像名> <容器启动之后执行命令>
2.创建守护式容器
docker run -itd --name=<容器名> <镜像名>
3.进入已经运行容器
docker exec -it <容器名|容器id> <进入容器执行命令>
4.查看本地正在运行的容器
docker container ls
5.查看本地所有的容器(包括已经停掉的容器)
docker container ls -all
6.停止正在运行的容器
docker container stop|kill <容器名|容器id>
7.启动已经停止的容器
docker container start <容器名|容器id>
8.删除已有的容器
docker container rm <容器名|容器id>
2.2打包
将所有的应用和依赖环境装好之后,可以开发我们的项目,完成之后打包好就可以给别人使用了。
1.先将这个容器变成镜像
docker commit 容器名 镜像名 docker commit myubuntu2 ubuntu_with_mysql
2.将镜像打包成文件
docker save -o 保存的文件名 镜像名 docker save -o mysql.tar ubuntu_with_mysql
3.其他Linux电脑装好docker后可以加载文件到本地镜像,然后就可以使用了。
docker load -i 文件路径 docker load -i mysql.tar
3.自定义文件存储
默认情况下,使用admin管理站点上传图片时,Django会调用默认文件存储系统类中的 _save
方法进行文件的保存,并将 _save
的返回值保存在对应表中的image字段中。
FileSystemStorage是Django的默认文件存储类,该类中的 _save
方法会将文件保存在MEDIA_ROOT指定的目录下方。这个目录是在服务器的本地,我们是想将其保存到FDFS中,因此我们需要自定义文件存储。
3.1步骤
1.自定义文件存储类。Storage_save
_save()
:需要写代码将客户端上传文件上传到FDFS系统
2.修改Django默认文件存储类的配置项:DEFAULTFIFLSTORAGE
4.CKEditor富文本编辑器
问:什么是富文本?
答:带有格式的文本。
5.网站性能优化-页面静态化
获取首页数据:
1.获取商品分类API
2.获取首页广告API
每个用户访问首页时都会查两次数据库。
假如1分钟之内有1000个用户访问了网站的首页,1分钟之内就需要查询2000次数据库,但是假如1分钟之内,数据库中商品分类和首页广告数据并没有发生变化,其实这2000次数据库查询和2次数据库查询获取的结果最终是一致的。那么就需要考虑网站性能的优化了。
5.1概念
对于经常被用户访问的页面,可以将页面用到的数据从数据库中查询之后,利用查询到的数据生成一个静态页面,当用户来访问页面时,直接返回生成的静态页面,而不再去查询数据库,这样就能减少数据库的查询,从而提升网站的性能。
只有被访问频繁的页面才需要进行优化。
5.2页面静态化步骤
1.准备一个对应页面的模板文件,在模板文件中使用模板语言定义所需填充的数据以及数据怎么进行展示。
2.定义一个函数,调用这个函数来生成对应的静态页面。
2.1从数据库中获取模板文件所需的数据。
2.2调用模板文件进行模板渲染,给模板文件传递数据,将模板文件的变量进行替换,获取替换之后的html的内容。
2.3将渲染之后的html内容保存成一个静态文件。
5.2.1代码实现
def generate_static_index_html(): """生成首页静态页面index.html""" # 1.从数据库中查询出首页所需的商品分类和首页广告。 ... # 2.调用index.html模板文件,进行渲染,给模板文件传递数据,进行模板变量替换,获取替换之后页面内容。 context = { 'categories':categories, 'contents':contents } # 2.1加载模板:指定使用模板文件 from django.template import loader temp = loader.get_template('index.html') # 2.2模板渲染:获取替换之后html页面内容 res_html = temp.render(context) # 3.将替换之后的内容保存成一个静态页面。 save_path = '保存文件路径' with open(save_path,'w') as f: f.write(res_html)
5.3静态化页面更新
使用场景:保持静态页面的数据和数据库表数据同步
数据表数据变化时再更新:对于数据更新不频繁的页面,什么时候页面所用的数据表的数据发生变化时,再调用静态页面函数,重新生成对应静态页面。
定时任务:Linux系统中的功能。对于页面数据更新比较频繁的页面,可以将生成静态页面的函数添加到操作系统的定时任务中,让操作系统每隔一段时间自动调用生成静态页面的函数,来实现静态页面的更新。
在Django执行定时任务,可以通过扩展 django-crontab
来实现.
5.3.1安装
pip install django-crontab
5.3.2添加应用
INSTALLED_APPS = [ ... 'django_crontab', # 定时任务 ... ]
5.3.3设置任务的定时时间
在配置文件中设置定时执行的时间
每个定时任务分为三部分定义:
任务时间
基本格式 : * * * * * 分 时 日 月 周 命令 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/smart/Desktop/meiduo_mall/logs/crontab.log') ]
5.3.4开启定时任务
添加定时任务到系统中
python manage.py crontab add
显示已经激活的定时任务
python manage.py crontab show
移除定时任务
python manage.py crontab remove
5.3.5解决中文字符问题
在定时任务中,如果出现非英文字符,会报出字符异常错误。
可以通过在配置文件中添加定时任务执行的附加命令来实现。
# 解决crontab中文问题 CRONTAB_COMMAND_PREFIX = 'LANG_ALL=zh_cn.UTF-8'
定时任务还可以用在定时删除日志的时候,可以编写代码实现。
5.4商品详情页静态化操作
对于网站中每个商品,都生成它对应的静态页面,当用户来访问那个商品的时候,就返回那个商品的静态详情页面。
5.4.1详情静态页面更新
当详情页所使用的数据表的数据发生变化时,再重新生成对应商品的静态详情页面。
5.4.2需求
管理员在admin站点修改完数据,点击『保存』按钮的时候:
1.将更新数据保存到数据表中。
2.重新生成对应商品静态详情页面。(Django没有提供)
5.4.3详情静态页面生成函数
将详情静态页面生成函数封装成celery任务函数。管理员在admin站点修改完指定商品详情点击『保存』按钮的时候,只是发出一个任务即可。
Admin管理员通过admin站点修改指定商品数据之后,处理完数据保存,还要将指定商品的静态详情页面重新生成。
5.4.4代码实现
def generate_static_sku_detail_html(sku_id): """生成指定商品的静态详情页面""" # 1.从数据库中查询详情页所需数据 ... # 2.使用模板文件detail.html,进行模板渲染,获取渲染之后的html内容 context = { 'categories':categories, 'goods':goods, 'specs':specs, 'sku':sku } # 2.1加载模板:指定使用的模板文件获取一个模板对象 from django.template import loader temp = loader.get_template('detail.html') # 2.2模板渲染 res_html = temp.render(context) # 3.将渲染之后的html内容保存成一个静态页面 save_path = os.path.join(settings.GENERATED_STATIC_HTML_FILES_DIR,'goods/%s.html' % sku_id) with open(save_path,'w') as f: f.write(res_html)
6.Django Admin站点保存数据的处理流程
当管理员通过Admin站点维护某个数据表的数据时,保存时,该数据表模型类对应 Admin管理类
中的两个方法会被调用:
1. save_model
:数据修改或新增时调用。
2. delete_model
:数据删除时调用。
7.批量生成商品静态页面
商品详情页面比较多,我们在上线之前又必须全部生成,因此我们可以编写脚本文件,一次性生成所有的商品详情页面。
编写一个脚本文件。
#!/usr/bin/env python """ 功能:手动生成所有SKU的静态detail html文件 使用方法: ./脚本文件名.py """ import sys sys.path.insert(0, '../') # 设置Django运行所依赖的环境变量 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__': skus = SKU.objects.all() for sku in skus: print(sku.id) generate_static_sku_detail_html(sku.id)
首行需要填写执行此文件的编译器,我们选择环境中的python执行此文件。