BZ易风

导航

 

login_required 装饰器

1.直接调用

在路由中应用login_required装饰器user/urls.py

from django.conf.urls import url
from user.views import RegisterView, ActiveView, LoginView, UserInfoView, UserOrderView,  AddressView # 导入视图类
from django.contrib.auth.decorators import login_required  # login_required登录验证装饰器

urlpatterns = [
    # url(r'^register$', views.register, name='register'),
    # url(r'^register_handle$', views.register_handle, name='register_handle'),
    # url(r'^login$', views.login, name='login'),

    url(r'^register$', RegisterView.as_view(), name='register'),  # 用户注册
    url(r'^active/(.*)$', ActiveView.as_view(), name='active'),  # 用户激活
    url(r'^login$', LoginView.as_view(), name='login'),  # 用户激活
    url(r'^$', login_required(UserInfoView.as_view()), name='user'),  # 用户激活  使用登录验证
    url(r'^order$', UserOrderView.as_view(), name='order'),  # 用户激活
    url(r'^address$', AddressView.as_view(), name='address'),  # 用户激活

]

login_required()完成下面的事情:

  • 如果用户没有登入,则重定向到settings.LOGIN_URL,并将当前访问的绝对路径传递到查询字符串中。例如:/accounts/login/?next=/polls/3/
  • 如果用户已经登入,则正常执行视图。视图的代码可以安全地假设用户已经登入。

settings.py中配置跳转得登录路由

# 登录地址
LOGIN_URL = '/user/login'  # 如果没登录会跳转这里登录

如果登录了,跳转到先前访问得地址

class LoginView(View):
    '''登录'''
    def get(self, request):
        '''显示登录页面'''
        # 判断是否记住用户名
        if 'username' in request.COOKIES:
            username = request.COOKIES.get('username')
            checked = 'checked'
        else:
            username= ''
            checked = ''
        # 使用模板
        return render(request, 'login.html', {'username':username, 'checked':checked})

    def post(self, request):
        '''登录校验'''
        # 接收数据
        username = request.POST.get('username')
        password = request.POST.get('pwd')
        # print(username)
        # print(password)

        # 校验数据
        if not all([username, password]):
            return render(request, 'login.html', {'errmsg':'数据不完整'})

        user = authenticate(username=username, password=password)  # 查找数据库,有的话返回user信息 没有的话返回None
        print(user.password)
        if user is not None:
            # 用户名和密码正确
            # 验证是否激活
            if user.is_active:
                # 用户已激活
                # 记录用户登录状态
                # print(user.is_active)
                flag = login(request, user)  # django.contrib.auth中的login方法
                # 跳转到首页
                # response = redirect(reverse('goods:index'))  # HttpResponseRedirct

                # 接收当前访问的地址
                next_url = request.GET.get('next', reverse('goods:index'))  # get() 第二个参数设置默认地址
                # 登录校验 如果登录了 跳转到先前访问的地址
                response = redirect(next_url)
                # 判断是否要记住用户名
                remember = request.POST.get('remember')
                print(remember)
                if remember == 'on':
                    # 记住用户名
                    response.set_cookie('username', username, max_age=7*24*3600)  # 记录cookie
                else:
                    response.delete_cookie('username')
                # 返回response
                return response

            else:
                return render(request, 'login.html', {'errmsg':'用户尚未激活'})
        else:
            # 用户名或密码错误
            return render(request, 'login.html', {'errmsg':'用户名或密码错误'})

 2.封装方法 基于类视图使用Mixin

创建一个工具包utils 

 

 

 创建mixin.py文件 封装as_view() 方法的Mixin

from django.contrib.auth.decorators import login_required  # 导入登录认证包

class LoginRequiredMinxin(object):
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(LoginRequiredMinxin, cls).as_view(**initkwargs)
        return login_required(view)

需要登录认证得视图函数继承LoginRequiredMixin类即可

 

from utils.mixin import LoginRequiredMinxin
# 用户信息中心
# /user
class UserInfoView(LoginRequiredMinxin, View):
    def get(self, request):
        '''显示用户信息页面'''
        return render(request, 'user_center_info.html', {'page':'user'})


# 用户订单中心
# /user/order
class UserOrderView(LoginRequiredMinxin, View):
    def get(self, request):
        '''显示用户信息页面'''
        return render(request, 'user_center_order.html', {'page':'order'})


# 用户地址
# /user/address
class AddressView(LoginRequiredMinxin, View):
    def get(self, request):
        '''显示用户信息页面'''
        return render(request, 'user_center_site.html', {'page':'address'})

路由urls.py

  url(r'^$', UserInfoView.as_view(), name='user'),  # 用户激活  使用登录验证
    url(r'^order$', UserOrderView.as_view(), name='order'),  # 用户激活
    url(r'^address$', AddressView.as_view(), name='address'),  # 用户激活

 

基于类视图函数得简介:https://yiyibooks.cn/xx/django_182/topics/class-based-views/intro.html

posted on 2019-09-29 17:57  BZ易风  阅读(348)  评论(0编辑  收藏  举报