美文网首页
Python Web框架 Django - cookie和tok

Python Web框架 Django - cookie和tok

作者: 莫名ypc | 来源:发表于2018-11-30 17:39 被阅读0次

cookie:

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

session:

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

token:

Token值介绍
token 值: 登录令牌.利用 token 值来判断用户的登录状态.类似于 MD5 加密之后的长字符串.
用户登录成功之后,在后端(服务器端)会根据用户信息生成一个唯一的值.这个值就是 token 值.
基本使用:
在服务器端(数据库)会保存这个 token 值,以后利用这个 token 值来检索对应的用户信息,并且判断用户的登录状态.
用户登录成功之后,服务器会将生成的 token 值返回给 客户端,在客户端也会保存这个 token 值.(一般可以保存在 cookie 中,也可以自己手动确定保存位置(比如偏好设置.)).
以后客户端在发送新的网络请求的时候,会默认自动附带这个 token 值(作为一个参数传递给服务器.).服务器拿到客户端传递的 token 值跟保存在 数据库中的 token 值做对比,以此来判断用户身份和登录状态.

设置cookie

set_cookie方法参数说明:

key表示设置的名称
value表示设置的值
max_age表示多少秒后过期
expires表示datetime类型的日期, 表示多久后过期

def index(request):
    # 返回随机值到cookie中
    res = HttpResponse('hello')
    # key表示设置的名称, value表示设置的值, max_age表示多少秒后过期,
    # expires表示datetime类型的日期, 表示多久后过期
    res.set_cookie('token', '123123', 6000)
    return res

获取token

def get_token(request):
    # COOKIES:传递客户端中的cookie内容
    # GET: 获取http GET请求中传递的参数。 如:127.0.0.1/xxx/?id=1&name=xxx/
    # POST:获取http POST请求中传递的参数
    # FILES: 获取页面中传递的图片文件
    # path: 获取当前请求的URL路径
    # method: 获取请求方式
    if request.method == 'GET':
        token = request.COOKIES.get('token')
        # 做令牌是否有效的校验
        return HttpResponse('获取令牌')

发送请求时的值与对应的说明

说明
COOKIES 传递客户端中的cookie内容
GET 获取http GET请求中传递的参数。 如:127.0.0.1/xxx/?id=1&name=xxx/
POST 获取http POST请求中传递的参数
FILES 获取页面中传递的图片文件
path 获取当前请求的URL路径
method 获取请求方式

实现注册的视图函数

def register(request):
    if request.method == 'GET':
        # GET 访问http://127.0.0.1:8080/register/
        return render(request, 'register.html')

    if request.method == 'POST':
        # 1.先获取注册的账号和密码和确认密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        password2 = request.POST.get('password2')
        # 2.判断用户名是否已经被注册过
        my_username = MyUser.objects.filter(username=username).exists()
        if my_username:
            print('用户名已注册')
            err_name = '用户名已存在'
            return render(request, 'register.html', {'err_name': err_name})
        else:
            print('用户名可用')

        # 3.判断密码和确认密码是否为空且密码是否相同
        if password and password2:
            if password != password2:
                print('密码不一致')
                err_password = '密码不一致'
                data = {
                    'err_password': err_password
                }
                return render(request, 'register.html', {'err_password': data})
        else:
            err_password = '密码和确认密码不能为空'
            return render(request, 'register.html', {'err_password': err_password})

        # 4.如果用户名不存在,且密码和确认密码相同,则实现注册,保存数据
        new_user = MyUser()
        new_user.username = username
        new_user.password = password2
        new_user.save()
        return HttpResponseRedirect('/login/')

实现登录的函数

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    if request.method == 'POST':
        # 1.获取登录提交的用户名和密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 2.查询数据库中用户名和密码对应的用户对象
        user = MyUser.objects.filter(username=username, password=password).first()
        if not user:
            err = '用户名或者密码错误'
            return render(request, 'login.html', {'err': err})
        # 3.登录操作
        # 给予登录成功的标识符(令牌),存在于cookie中
        res = HttpResponseRedirect('/my_index/')
        token = functions.create_token()
        res.set_cookie('token', token, 6000)
        # 向TokenUser表中加入数据
        token_user = TokenUser.objects.filter(user=user).first()
        if token_user:
            token_user.token = token
            token_user.save()
        else:
            TokenUser.objects.create(token=token, user=user)
        # 4.跳转到首页
        return res

登录后才能访问index.html页面

没有登录不让访问index.html, 而是访问login.html页面

def my_index(request):
    if request.method == 'GET':
        # # 登录后才能访问index.html页面
        # # 没有登录不让访问index.html, 而是访问login.html页面
        # token = request.COOKIES.get('token')
        # if token == '123123':
        #     return render(request, 'index.html')
        # else:
        token = request.COOKIES.get('token')
        # 判断token是否有效
        token_user = TokenUser.objects.filter(token=token).first()
        if token_user:
            return render(request, 'index.html')
        else:
            return HttpResponseRedirect('/login/')

相关文章

网友评论

      本文标题:Python Web框架 Django - cookie和tok

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