电商网站中个人中心页的设计

419 阅读1分钟

个人中心页

安装 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'),  # 地址页

]

这两个页面同样是登录才能够访问的。