zoukankan      html  css  js  c++  java
  • django-登录认证

    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

  • 相关阅读:
    Cocos2d Box2D之动态刚体
    Cocos2d Box2D之简介
    Cocos2d-x之物理引擎
    Cocos2d-x之UI控件简介
    Cocos2d-x之数据的处理
    My First Django Project (3)
    My First Django Project (2)
    My First Django Project
    Python 学习笔记
    利用python scrapy 框架抓取豆瓣小组数据
  • 原文地址:https://www.cnblogs.com/yifengs/p/11609219.html
Copyright © 2011-2022 走看看