zoukankan      html  css  js  c++  java
  • pythondjango框架电商项目首页开发_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插入数据,然后看是否取值正确了,
  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/andy0816/p/11912036.html
Copyright © 2011-2022 走看看