python电商项目源码_python-django框架-电商项目-首页开发_20191122

python-django框架-电商项目-首页开发

业务背景:

用户浏览网站一定是先到首页,

没有登陆的话首页内容完全一样,而且是不经常变化的,

一段时间内,有100用户访问,就要有几个用户就要查询多少次数据库,

查出来的数据都是一样的,

怎么办?

我们把页面生成一个静态页面,

用户访问的时候,我给用户返回一个静态的页面,

可以使用我们之前讲到的celery,定义一个任务函数,生成一个静态页面,

什么时候首页的静态页面需要重新生成?

页面改动的时候就需要重新生成,

当管理员在后台修改了首页的信息,对应的表格中的数据的时候,需要重新生成我们的首页静态文件,

给celery定义个任务函数:

generate_static_index_html函数

在虚拟机启动worker,

把项目代码复制到虚拟机中,可以放到桌面

进入项目路径,/home/andy/桌面/dailyfresh/,一定要在这个项目目录下面!!

进入虚拟机工作空间,workon lq_py3

启动这个任务,celery -A celery_tasks.tasks worker -l info

报错了,应该是有服务没有启动,借这个机会,我重新梳理一下celery,重新开一个博客,

启动成功了,继续,

发出celery任务

在django的console,

输入from celery_tasks.tasks import generate_static_index_html

generate_static_index_html.delay()

现在这个页面已经生成了,但是这个文件是在Ubuntu生成的,那我们怎么访问这个页面?

配置Nginx提交静态页面,

我们启动了一个celery的task

我们只要一发送django的这个任务,就会生成静态页面,

但是这个页面是生成在celery这边的,

怎么访问?

Nginx之前可以提供图片,同样的,用户可以直接访问Nginx,Nginx也可以返回静态页面,

所以用户只要访问浏览器,直接访问Nginx就可以返回对应的页面了,

需要配置一下,

打开配置文件,在usr/local/nginx

配置文件可以再加一个server,一个server就是一个Nginx服务器,

加两个地方的配置项,

重启Nginx,

sudo sbin/nginx -s reload

nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

解决方法:

[root@localhost nginx]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

这个时候实际启动了两个server,一个8888,一个80,

这个时候在虚拟机中输入http://127.0.0.1/,默认访问80端口,就可以看到我们的首页了,

在外部访问也是一样的,http://192.168.100.128/

更新首页内容时,重新生成静态页面,

后台admin修改了首页的内容,就需要再次生成静态页面,

如何操作?

每一个后台管理页面,都可以定义一个模型管理类,继承modeladmin,

这里面有两个方法, 一个savemodel,一个deletemodel,

后台管理员更新数据的时候,就会执行savemodel,如果删除数据就是deletemodel,

我们需要在这两个方法中加附加的操作,修改的时候重新生成静态页面

我们不能改他的源代码,我们可以重写这个方法,

生成静态页面的代码,我们采用异步,就是因为生成的代码需要时间,如果生成比较就页面就会比较卡,

静态页面和indexview的调度说明:

我们访问静态页面,是访问的Nginx,但是django和Nginx可能不在一台电脑上,

怎么让用户直接访问静态页面,

部署的时候,

django网站,celery服务器,这可能在不同的电脑,

django服务器上是indexviews,

celery服务器上是一个静态页面,

搭建一个Nginx,用来调度,Nginx有自己的ip,浏览器用户访问整个网站的时候,我只暴露Nginx的ip,我只会告诉客户Nginx的服务器,先去请求Nginx,然后Nginx决定是要返回静态页面,还是调用django的视图,

怎么区分,需要对两个地址做设计,直接访问Nginx地址的ip的时候,直接把静态的页面找到,如果是访问的是一个ip后面还有地址,比如一个index,就要交给django服务器,这就是区分的方法,

http://192.168.100.128/,访问celery服务器的静态页面,

http://192.168.100.128/index,访问django服务器的indexviews视图,

所以我们队indexviews的对对应的地址做一个修改,加上index,

还有好几个页面没有写,后面需要自己写的,

页数数据的缓存:

什么是页面数据的缓存?

看首页,很多内容无论有没有登陆都是一样的,

有区别的地方是登陆之后有一部分不一样,

这样很多人访问首页,就要反复查数据库,所以可以把页面存放在缓存中,当再次使用这些数据时,先从缓存中获取,如果获取不到,再去查询数据库, 减少数据库查询的次数

django中的缓存相关的知识:

django提供了缓存的功能,使用缓存的目的就是可以方便拿,通过配置setting中的cash可以配置缓存,

有几种级别,

站点级别的缓存,这个是整个网站都缓存,这个占用的空间太大了,不合适,

单个view的缓存,django提供了一个方法,cash_page,这是一个装饰器,这种第一次访问视图的时候缓存起来,然后下一次从缓存中取,这种不合适,为什么?因为每一个用户的数据是不一样的,所以不能使用单个view的缓存,

模板片段的缓存,load_cache,这种业不合适,因为使用模板的时候最后使用模板, 但是前面都查完了所以不合适,

所以都不合适,

所以我们需要操作底层的缓存api,自己设计,

怎么设计?

我们缓存的时候只需要缓存一部分数据,拿到数据之后就可以设置缓存了,

用法:

from django.core.cache import cache

cache.set(key,value,过期时间timeout),这个timeout可选,不选就是永久,所以要设置,

设置成功了,从redis客户端可以查看到,

context = cache.get('index_page_data')

什么时候更新缓存的数据?

管理员修改了首页的数据的时候,需要更改缓存的数据,

还是在admin里面,把之前缓存的数据清除,下一次就会再次生成这个数据的缓存,就相当于更新了,

cache.delete('index_page_data')

为什么缓存要设置过期的时间?

数据改了还是会显示缓存的内容,所以要设置过期时间,防止一直都是查的缓存,

总结一下页面的静态化和缓存的设置:

其实不影响网站的功能,是对网站性能的优化,

你进行网站优化,一个关键点,就是减少数据库查询的次数,

面试问道就是页面的静态化,和数据的缓存,

还可以防止恶意的攻击,黑客同时对你的服务器发起访问,如果你没有使用页面静态化,你就要每次都要查,数量太大了,你的网站是处理不了的,会导致网站崩溃,

首页内容的获取和展示:

获取商品的种类信息,

获取首页的轮播商品信息,

获取促销活动信息,

获取首页分类商品展示信息,

获取用户购物车商品数量,

redis存储购物车记录分析:

1,什么时候添加购物车记录?

用户点击添加到购物车的时候添加,

在商品详情页面点击加入购物车,还有在商品列表页点击加入购物车,

两个地方都可以加入购物车,我们需要添加购物车记录,,

2,什么时候需要获取购物车记录,

页面的顶部需要,和购物车页面需要获取,

3,使用什么存储购物车记录,

这个和浏览记录一样,浏览比较快,添加购物车也是比较快,存在表里面会不停的访问数据库,所以我们使用redis存储购物车记录,

4,分析存储购物车记录的格式

一个用户的记录使用一条记录保存,

我应该保存什么内容,添加数量,skuid,用户id,我不需要把商品的价格名称都记下来,

我们使用什么格式保存?

上一次保存浏览记录使用的list,

分析:

使用列表:

cart_用户id[“1,5”“2,3”]这是商品1,加了5件,商品2加了3件,可以做到,但是用户再次加了商品2两个,还需要操作这条数据,

使用hash,

cart_用户id:{sku_id1:商品数目,sku_id2:商品数目},所以使用hash比较方便,

例子:

cart_1:{1 : 2, 2 : 3 }

HLEN这个命令,把购物车商品的条数,就知道了购物车的数量了,

获取购物车的数目:

判断登陆,

然后连接redis,开始取值,

模式取数据,在redis插入数据,然后看是否取值正确了,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值