美文网首页
Django_day06

Django_day06

作者: HavenYoung | 来源:发表于2018-09-17 17:21 被阅读0次

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

相关文章

  • Django_day06

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

网友评论

      本文标题:Django_day06

      本文链接:https://www.haomeiwen.com/subject/pwernftx.html