个人中心页
安装 django-redis
我们安装 django-redis 来保存用户的购物车信息、最近浏览记录等等。
pip install django-redis
安装的过程中会安装前向的依赖 redis。
安装完成之后就来 update 一下我们的依赖文件吧:
创建路由
urlpatterns = [
# ...
url(r"^$", UserInfoView.as_view(), name='info'), # info
]
对应创建视图
class UserInfoView(View):
def get(self, request):
return HttpResponse("个人中心")
请求 /user 路由:
登录校验
我们来思考一个问题,只有在用户已经登录的情况下,我们才让其访问个人中心等关于用户个性化的隐私页面。 所以我们需要对到来后端的请求进行一个登录校验。
django 中自带 login_required 的方法可以来做这件事。
我们可以在路由中这样写:
同时,在配置中增加未登录的跳转路径:
这时我们访问用户中心页,若用户未登录,就会跳转到登录页:
直接请求登录页面与从其他页面跳转到登录页面的区别是,后者带着一个 next 的小尾巴, 后面我们再来说怎么处理这个“小尾巴”。
我们在登录页面进行登录,然后从 url 栏去访问个人中心页面,这时即可完成个人中心的访问。
巧用 next 参数
想象一下我们一般去访问电商网站的流程,当用户访问私密页面 A, 检测用户未进行登录,跳转到登录页面时,当用户在该页面完成了登录,应该跳转回原始原始网页 A。 这一步是怎样实现的呢?
我们可以在登录的 post 请求中去捕获 next 参数,如可以捕获到这个参数的值,就形成一个跳转响应。最后定向到这个响应中去。
使用 Mixin 类完成登录检验
在 url 路由中套一层登录校验,代码不够优雅。一般我们用 Mixin 类来做这个登录校验的逻辑。
再由需要登录才能访问的视图类去继承这个 Mixin 类即可。
首先我们在项目跟目录下新建一个工具类的包:utils
在其中创建 mixin.py 文件,
# utils/mixin.py
from django.contrib.auth.decorators import login_required
from django.utils.decorators import classonlymethod
class LoginRequiredMixin(object):
@classonlymethod
def as_view(cls, **initkwargs):
views = super(LoginRequiredMixin, cls).as_view(**initkwargs)
return login_required(views)
然后我们在个人中心的类视图中继承这个类即可:
# apps/user/views.py
class UserInfoView(LoginRequiredMixin, View):
def get(self, request):
return HttpResponse("个人中心")
创建个人中心的地址页和订单页面
根据设计,我们的个人中心一共会有 3 个页面, 分别是 用户页、地址页、订单页。 我们仿照用户页面将其他的两个页面先模拟创建出来:
# apps.user.views.py
class UserOrderView(LoginRequiredMixin, View):
def get(self, request):
return HttpResponse("订单页")
class AddressView(LoginRequiredMixin, View):
def get(self, request):
return HttpResponse("地址页")
# apps.user.urls.py
urlpatterns = [
# ...
url(r"^order/$", UserOrderView.as_view(), name='order'), # 订单页
url(r"^site/$", AddressView.as_view(), name='site'), # 地址页
]
这两个页面同样是登录才能够访问的。