Django_day06

cookie

登录index时,判断用户是否登录过(cookie是否有效)
方法一:
在views中设置

def index(request):
    if request.method == 'GET':
        # get ticket from cookie
        ticket = request.COOKIES.get('ticket')
        # get values from UserTicket by ticket
        user_ticket = UserTicket.objects.filter(ticket=ticket).first()
        if user_ticket:
            # get user who login
            user = user_ticket
            return render(request, 'index.html', {'user': user})
        else:
            return HttpResponseRedirect(reverse('users:login'))

方法二:
使用装饰器
需要新建目录utils,utils下有2个py文件


utils目录

在functions.py文件中写修饰器代码

def is_login(func):

    def check(request):
        ticket = request.COOKIES.get('ticket')
        # if ticket existed
        if ticket:
            user_ticket = UserTicket.objects.filter(ticket=ticket).first()
            if user_ticket:
                return func(request)
            else:
                return HttpResponseRedirect(reverse('users:login'))
        # if not existed
        else:
            return HttpResponseRedirect(reverse('users:login'))

    return check
@is_login
def index(request):
    if request.method == 'GET':
        return render(request, 'index.html')

方法三:
使用中间件(middleware)
在utils目录下新建UserAuthMiddleware.py文件
在此文件中编写功能代码

from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin

from users.models import UserTicket


class UserMiddleware(MiddlewareMixin):
    # rebuild process_request
    @staticmethod
    def process_request(request):
        # get ticket
        ticket = request.COOKIES.get('ticket')
        # set urls which need no middleware
        not_login_path = ['/users/login/', '/users/register/']
        path = request.path
        # check url
        for n_path in not_login_path:
            # which need no middleware
            if path == n_path:
                return
        # no ticket,go to login.html
        if not ticket:
            return HttpResponseRedirect(reverse('users:login'))
        # get user by ticket
        user_ticket = UserTicket.objects.filter(ticket=ticket).first()
        # check user
        if not user_ticket:
            # no such user,go to login.html
            return HttpResponseRedirect(reverse('users:login'))
        # set global user
        request.user = user_ticket.user
        # middleware ends,return
        return None

校验
a)在视图函数中判断ticket是否为空,是否能在服务端中找到对应的user对象
b)使用闭包--->装饰器
外部内函数中内嵌函数,内嵌函数调用外部函数的参数,外部函数返回内部函数
c)中间件,重构process_ request()方法, 实现的功能和定义闭包的功能一样
302重定向
全局user, request. user默认为AnnoyMousUser

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...
    老肖阅读 3,078评论 0 18
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,241评论 4 16
  • 【读经】 约书亚记14-15章 【金句】 至于住耶路撒冷的耶布斯人,犹大人不能把他们赶出去,耶布斯人却在耶路撒冷与...
    chanor阅读 1,178评论 0 0