1. FastDFS
- 海量存储, 存储容量扩展方便
- 防止文件内容重复
-
结合nginx提高网站访问图片的效率
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/'
3. 商品首页
- 动态给对象增加属性
4. 使用redis保存购物车信息
- 用户点击加入购物车时需要添加购物车记录
- 用户访问购物车页面时获取用户的购物车记录
- 每个用户的购物车记录用一条数据保存
hash:cart_用户id: {'sku_id1': 数量, 'sku_id2': 数量} - 统计hash中元素的数量: hlen
5. 页面静态化
-
把原本动态的页面处理结果保存成html文件, 让用户直接访问生成出来的静态html页面
什么时候需要重新生成静态页面?
管理员在后台修改了首页上数据表里的信息的时候,需要重新生成静态页面。
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)