2.电商总结商品模块

1. FastDFS

  • 海量存储, 存储容量扩展方便
  • 防止文件内容重复
  • 结合nginx提高网站访问图片的效率


    2.电商总结商品模块_第1张图片
    WX20171215-113919.png

2. Django对接fdfs

  • 自定义文件存储类
from fdfs_client.client import Fdfs_client
from django.core.files.storage import Storage
from django.conf import settings


class FDFSStorage(Storage):
    # fast dfs 文件储存类
    def __init__(self, client_conf=None, base_url=None):
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url

    def _open(self, name, mode='rb'):
        pass

    def _save(self, name, content):
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象
        # 创建一个Fdfs_client对象

        client = Fdfs_client(self.client_conf)
        res = client.upload_by_buffer(content.read())

        # dict
        # {
        #     'Group name': group_name,
        #     'Remote file_id': remote_file_id,
        #     'Status': 'Upload successed.',
        #     'Local file name': '',
        #     'Uploaded size': upload_size,
        #     'Storage IP': storage_ip
        # }
        if res['Status'] != 'Upload successed.':
            raise Exception('上传文件到fast dfs失败')
        filename = res['Remote file_id']
        return filename

    def exists(self, name):
        """Django判断文件名是否可用"""
        return False

    def url(self, name):
        """返回访问文件的url路径"""
        return self.base_url+name
  • 配置文件fdfs
# 设置Django的文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'

# 设置fdfs使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'

# 设置fdfs存储服务器上nginx的IP和端口号
FDFS_URL = 'http://192.168.191.134:8888/'
2.电商总结商品模块_第2张图片
WX20171215-114634.png

3. 商品首页

  • 动态给对象增加属性

4. 使用redis保存购物车信息

  • 用户点击加入购物车时需要添加购物车记录
  • 用户访问购物车页面时获取用户的购物车记录
  • 每个用户的购物车记录用一条数据保存
    hash:cart_用户id: {'sku_id1': 数量, 'sku_id2': 数量}
  • 统计hash中元素的数量: hlen

5. 页面静态化

  • 把原本动态的页面处理结果保存成html文件, 让用户直接访问生成出来的静态html页面


    2.电商总结商品模块_第3张图片
    WX20171215-193136.png
  • 什么时候需要重新生成静态页面?
    管理员在后台修改了首页上数据表里的信息的时候,需要重新生成静态页面。
    celery
    当修改了数据库数据时会调用管理类里的save_model或者delete_model

from django.contrib import admin
from goods.models import GoodsType, GoodsSKU, IndexGoodsBanner, IndexTypeGoodsBanner, IndexPromotionBanner
from django.core.cache import cache
# Register your models here.
class BaseModelAdmin(admin.ModelAdmin):
    def delete_model(self, request, obj):
        super().delete_model(request, obj)
        # 发出任务
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html.delay()
        # 删除缓存
        cache.delete('index_page_data')

    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)
        # 发出任务
        from celery_tasks.tasks import generate_static_index_html
        generate_static_index_html.delay()
        # 删除缓存
        cache.delete('index_page_data')


class IndexGoodsBannerAdmin(BaseModelAdmin):
    pass

admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)

6. 数据缓存

  • 把页面用到的数据缓存起来,如果使用这些数据的时候,先从缓存中获取,
    如果获取不到,再去查询数据库。

  • 什么时候缓存数据需要更新?
    管理员在后台修改了首页上数据表里的信息的时候,需要更新缓存数据。也是在管理器类
    首页数据缓存

class IndexView(View):
    def get(self, request):
        context = cache.get('index_page_data')

        if context is None:
            # 商品种类
            types = GoodsType.objects.all()

            # 获取首页轮播商品信息
            goods_banners = IndexGoodsBanner.objects.all().order_by('index')

            # 首页促销活动信息

            promotion_banners = IndexPromotionBanner.objects.all().order_by('index')

            for type in types:
                type.image_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')
                type.title_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')

            context = {
                'types': types,
                'goods_banners': goods_banners,
                'promotion_banners': promotion_banners
            }
            cache.set('index_page_data', context, 3600)
        user = request.user
        cart_count = 0
        if user.is_authenticated():
            conn = get_redis_connection('default')
            cart_key = 'cart_%d' % user.id
            cart_count = conn.hlen(cart_key)

        context['cart_count'] = cart_count

        return render(request, 'index.html', context)

网站本身性能的优化,减少数据库的查询的次数。防止恶意的攻击。DDOS攻击

你可能感兴趣的:(2.电商总结商品模块)