dockers登录小总结:
docker container start tracker
docker container start storage
docker container start elasticsearch
docker container ls
一:浏览历史记录:
0:先配置redis数据库配置:
"history": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.203.153:6379/3",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
1:添加用户浏览历史
1.1:编辑apps/users/views.py
from apps.goods.models import SKU
from django_redis import get_redis_connection
# 用户浏览历史记录
class UserBrowseHistory(LoginRequiredJSONMixin, View):
def post(self, request):
user = request.user
# 1、提取参数
# 2、校验参数
data = json.loads(request.body.decode())
sku_id = data.get('sku_id')
if not sku_id:
return JsonResponse({
'code': 400,
'errmsg': '缺少参数'
}, status=400)
try:
SKU.objects.get(pk=sku_id, is_launched=True)
except SKU.DoesNotExist as e:
return JsonResponse({
'code': 404,
'errmsg': '商品已下架/不存在'
}, status=404)
# 3、数据/业务处理 —— 把访问的sku的id写入redis表示记录一条浏览历史
# 3.1、获取"history"缓存配置的redis链接
conn = get_redis_connection('history')
p = conn.pipeline()
# 3.2、历史记录写入缓存
# 3.2.1、去重
p.lrem(
'history_%d' % user.id,
0, # 删除所有指定成员
sku_id
)
# 3.2.2、插入列表头
p.lpush(
'history_%d' % user.id,
sku_id
)
# 3.2.3、截断保留5个记录
p.ltrim(
'history_%d' % user.id,
0,
4
)
p.execute() # 批量执行redis指令
# 4、构建响应
return JsonResponse({
'code': 0,
'errmsg': 'ok'
})
1.2:编辑apps/users/views.py实现视图
from apps.goods.models import SKU
from django_redis import get_redis_connection
# 用户浏览历史记录
class UserBrowseHistory(LoginRequiredJSONMixin, View):
# .....
# 查看历史
def get(self, request):
user = request.user
# 1、提取参数
# 2、校验参数
# 3、数据/业务处理 —— 用户浏览的sku商品信息返回(读redis获取最近浏览的历史sku.id, 读mysql获取sku详细信息)
# 3.1、读redis获取浏览历史
conn = get_redis_connection('history')
# sku_ids = [b'6', b'3', b'4', b'14', b'15']
sku_ids = conn.lrange(
'history_%d' % user.id,
0,
-1
)
skus = [] # 用于记录返回sku商品的详细信息
# 3.2、读mysql获取详细信息
for sku_id in sku_ids:
# sku_id = b'6'
sku = SKU.objects.get(pk=int(sku_id))
skus.append({
'id': sku.id,
'name': sku.name,
'default_image_url': sku.default_image.url,
'price': sku.price
})
# 4、构建响应
return JsonResponse({
'code': 0,
'errmsg': 'ok',
'skus': skus
})
1.3:编辑apps/users/urls.py映射路由
urlpatterns = [
# ......
# 记录/访问历史
re_path(r'^browse_histories/$', views.UserBrowseHistory.as_view()),
]
二:使用pickle和base64模块
pickle模块: 把python的一个对象,编码成一个字节。
base64模块: 把三个字节,编码成一个可视化的字符。
1:进行pickle和base64加解密测试:
import pickle, base64
def main():
# 定义一个字典套字典的数据
cookie_cart = {
1: {
"count": 5,
"selected": True
},
2: {
"count": 15,
"selected": False
}
}
# 1:编码测试:字典数据--->字节数据 ---> 字节类型字符串数据--->encode变成前端可以看见的字符串。
cart_bytes = pickle.dumps(cookie_cart)
print("cart_bytes:", cart_bytes)
# : cart_bytes: b'\x80\x03}q\x00(K\x01}q\x01(X\x05\x00\x00\x00countq\x02K\x05X\x08\x00\x00\x00selectedq\x03\x88uK\x02}q\x04(h\x02K\x0fh\x03\x89uu.'
cart_string = base64.b64encode(cart_bytes)
print("cart_string:", cart_string)
# :cart_string: b'gAN9cQAoSwF9cQEoWAUAAABjb3VudHECSwVYCAAAAHNlbGVjdGVkcQOIdUsCfXEEKGgCSw9oA4l1dS4='
# 2:解码测试 变成前端可以看见的字符串decode--->字节类型字符串数据--->字节类型--->字典数据
cart_bytes = base64.b64decode(cart_string)
print("使用base64解码后的数据:", cart_bytes)
# 使用base64解码后的数据: b'\x80\x03}q\x00(K\x01}q\x01(X\x05\x00\x00\x00countq\x02K\x05X\x08\x00\x00\x00selectedq\x03\x88uK\x02}q\x04(h\x02K\x0fh\x03\x89uu.'
cart_dict = pickle.loads(cart_bytes)
print("使用loads解码后的数据:", cart_dict)
#使用loads解码后的数据: {1: {'count': 5, 'selected': True}, 2: {'count': 15, 'selected': False}}
if __name__ == '__main__':
main()
2:封装cookie购物数据编解码接口:
新建并编辑meiduo_mall/utils/cookiesecret.py封装cookie购物车数据的编解码接口
import pickle, base64
class CookieSecret(object):
# 自定义编码方法
@staticmethod
def dump(data):
"""请传入一个字典数据,返回一个字节类型的字符串数据"""
# 将字典数据编码字节类型数据
data_bytes = pickle.dumps(data)
#将字节类型数据编码成字节类型的字符串数据
data_string = base64.b64encode(data_bytes)
return data_string.decode()
@staticmethod
def loads(data):
"""请传入一个字节类型字符串的数据,返回一个字典类型数据"""
# 将可视化字节类型数据转换成真正的字节类型数据
data_bytes = base64.b64decode(data)
# 将字节类型数据转换成对象类型
data_dict = pickle.loads(data_bytes)
return data_dict
三:购物车模块:
1:数据库存储设计:
1.1
存储的主体数据是SKU商品;
用户登陆的时候,把购物车数据存入Redis中!
用户未登陆的时候,把购物车数据存入Cookie中!
1.2:用户登陆redis购物车存储设计 —— redis
具体存储的购物车数据有哪些?
答:需要把sku.id、sku商品数量和勾选状态存入redis里面!
1.3:选择redis类型:
# 记录购物车中的sku商品和其数量
# 采用哈希对象存储sku的id和其count数量
# 格式为 -- carts_<用户id> : {"1": "5", "2": "10"}
# 1、把一个sku商品及其数量添加购物车
hincrby carts_1 1 5
# 2、从购物车中获取sku商品及其数量
hgetall carts_1
# 记录sku商品的勾选状态
# 我们采用redis集合的方式来存储,sku.id在一个集合中表示该sku商品是被选中的
# 1、把一个sku商品选中
sadd selected_1 2
# 2、把一个sku商品取消勾选
srem selected_1 2
# 3、查看当前id为1用户选中的所有的sku商品
smembers selected_1
1.4:用户未登陆购物存储设计 —— cookie
存储哪些数据?
答: 需要把sku.id、sku商品数量和勾选状态存入cookie中!
我们自己设计一个json格式的数据记录cookie购物车数据:
{
"sku_id1": {
"count":"1",
"selected": True
},
"sku_id3":{
"count":"3",
"selected": True
},
"sku_id5":{
"count":"3",
"selected": False
}
}
cookie是明文的,且长度有限制,怎么解决?!
答:使用pickle和base64模块进行加解密。
2:准备工作:
2.1:新建carts应用
cd meiduo_mall/apps
python3 ../manage.py startapp carts
2.2:设置总路由和子路由:
编辑dev.py
INSTALLED_APPS = [
# ......
'apps.carts'
]
编辑meiduo_mall/urls.py
urlpatterns = [
# ......
re_path(r'', include('apps.carts.urls')),
]
2.3:配置购物车专用缓存:
"carts": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.203.153:6379/4",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
浙公网安备 33010602011771号