会话框架简介
你好!Django 是支持匿名会话的。会话框架允许您基于每个站点访问者存储和检索任意数据。它在服务器端存储数据并提供cookie的发送和接收。Cookie包含会话ID - 而不是数据本身(除非您使用基于cookie的后端)。
配置会话引擎
默认情况下,Django 在数据库里存储会话(使用 django.contrib.sessions.models.Session )。虽然这很方便,但在一些设置里,在其他地方存储会话数据速度更快,因此 Django 可以在文件系统或缓存中配置存储会话数据。:
- 使用数据库支持的会话 如果你想使用数据库支持的会话,你需要在 INSTALLED_APPS 里添加 ‘django.contrib.sessions’ 。
一旦在安装中配置,运行 manage.py migrate 来安装单个数据库表来存储会话数据。; - 使用缓存会话 可查看官网文档;
- 使用基于文件的会话 ;
- 使用基于cookie的会话 ;
本项目使用默认会话,数据库支持会话
会话常用语句
request.sesion[settings.CART_SESSION_ID] = {}#新建会话
request.session.get(settings.CART_SESSION_ID)#会话密钥检索方式
del request.session.cart[product_id]# 删除存储在会话中的密钥
将购物车存储在会话中
购物车工作方式:
- 当使用购物车时,需要先检测自定义会话密钥是否存在。不存在就新建购物车,并且将购物车和购物车内容一并存入购物车会话密钥中。
设置自定义会话密钥
settings.py文件中写入
CART_SESSION_ID = 'cart'
创建购物车app
django常规创建app并激活,在此不做赘述
django-admin startapp cart
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'shop.apps.ShopConfig',
->'cart.apps.CartConfig',
'orders.apps.OrdersConfig',
'payment.apps.PaymentConfig',
'coupons.apps.CouponsConfig',
'rosetta',
'parler',
]
创建购物车管理类
1.通过request对象初始化购物车,若是当前对象购物车为空,则新建购物车即在会话中设置一个空字典
2.将商品ID作为键,将商品数量和价格作为值,防止重复添加
3.实现添加购物车、清空购物车、计算购物车总价、删除购物车某个商品
from django.conf import settings
from shop.models import Product
from decimal import Decimal as dec
from coupons.models import Coupon
from decimal import Decimal
class Cart(object):
def __init__(self, request) -> None:
# 获取当前会话
self.sesion = request.session
cart = self.sesion.get(settings.CART_SESSION_ID)
if not cart:
cart = self.sesion[settings.CART_SESSION_ID] = {}
self.cart = cart
self.coupon_id = self.sesion.get('coupon_id')
def save(self):
# 会话对象它已经被修改 当设置为 True 时,Django 会根据每个请求将会话保存到数据库中。
self.sesion.modified = True
def add(self, product, quantity=1, override_quantity=False):
product_id = str(product.id)
if product_id not in self.cart:
self.cart[product_id] = {'quantity': 0, 'price': str(product.price)}
if override_quantity:
self.cart[product_id]['quantity'] = quantity
else:
self.cart[product_id]['quantity'] += quantity
self.save()
def remove(self, product):
product_id = str(product.id)
if product_id in self.cart:
del self.cart[product_id]
self.save()
def __iter__(self):
product_ids = self.cart.keys()
products = Product.objects.filter(id__in=product_ids)
cart = self.cart.copy()
for product in products:
cart[str(product.id)]['product'] = product
for item in cart.values():
item['price'] = dec(item['price'])
item['total_price'] = (item['price']) * item['quantity']
# 生成器
yield item
def __len__(self):
return sum(item['quantity'] for item in self.cart.values())
def get_total_price(self):
return sum(dec(item['price']) * item['quantity'] for item in self.cart.values())
def clear(self):
del self.sesion[settings.CART_SESSION_ID]
self.save()
@property
def coupon(self):
if self.coupon_id:
try:
return Coupon.objects.get(id=self.coupon_id)
except Coupon.DoesNotExist:
pass
return None
def get_discount(self):
if self.coupon:
return self.get_total_price() - (self.coupon.discount / Decimal(100)) * self.get_total_price()
return Decimal(0)
def get_total_price_after_discount(self):
return self.get_total_price() - self.get_discount()
创建购物车
不想做赘述
创建购物车视图模板
不想做赘述
创建购物车视图url
不想做赘述
项目链接添加链接描述