关于Django的session的使用 (装饰器版)

http协议是无状态,无状态的意思是每次请求都是独立的,它的这次请求和下次请求是没有关系的。

这样我们在web要判断是否登录就要传递一种信息给我们的服务器,让服务器根据你给的信息,返回你的东西

这里我是直接写如何在Django中使用的。

from django.shortcuts import render, redirect, HttpResponse
from users import models
from functools import wraps


# Create your views here.


# 登录权限控制(session版)
def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):

        if request.session.get("user"):
            return func(request, *args, **kwargs)
        else:
            next_url = request.path_info
            print(next_url)
            return redirect("/app01/login/?next_url={}".format(next_url))

    return inner

# 在login中设置session
def login(request):
    error_msg = None
    # 如果请求是POST就进去
    if request.method == 'POST':
        email = request.POST.get('email', None)
        pwd = request.POST.get('pwd', None)
        next_url = request.GET.get("next_url", None)
        if email == 'liuhong@qq.com' and pwd == '123':
            # 设置一个session
            request.session['user'] = email
            if next_url:
                req = redirect(next_url)  # 得到一个对象
            else:
                return HttpResponse('没有next_url的返回值')
            return req
        else:
            error_msg = '用户名或密码错误!!'
    return render(request, 'session/login.html', {'error': error_msg})


@check_login
def user_list(request):
    ret = models.Users.objects.all()
    return render(request, 'session/user_list.html', {'user_list': ret})


# 注销函数
def logout(request):
    # 只删除session数据
    # request.session.delete()
    # 如何删除session数据和cookie
    request.session.flush()
    return redirect("/app01/login/")

这里要注意的是,在你的前端代码中的form表单的提交中的action的设置,要么为空要么就设置为下面哪种

<form class="form-horizontal" action="{{ request.get_full_path }}" method="post">

 

posted @ 2018-11-22 21:27  a_py  阅读(202)  评论(0编辑  收藏  举报