美文网首页
day45-Django视图

day45-Django视图

作者: xdxh | 来源:发表于2018-11-30 17:40 被阅读0次

    一、cookie和session

    1.cookie
    HTTP 协议是无状态的。因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一个典型的应用场景,就是用于记录用户在网站上的登录状态。
    2.cookie方法

    #1.设置cookie
        response.set_cookie(key, value, max_age=None)
    
    #2.获取cookie
        reqeust.COOKIES.get(key)
    
    #3.删除cookie
        request.delete_cookie(key)
    

    注意:cookie不能跨浏览器
    3.session
    session:服务端会话技术,依赖于cookie。
    会话技术,比如在做登录功能的时候,需要配合使用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能。 在cookie中保存了用户的信息,特别是一个特殊的令牌(token)信息,当用户拿着这个特殊的令牌来访问网站的时候,网站会从cookie中 获取这个特殊令牌去数据库session中去查询是否有这个对应的令牌的信息,如果有则验证成功,就可以把用户的信息返回给客户端 了,如果验证失败则提示用户没有登录等提示信息。
    4.request对象
    COOKIES:传递客户端的cookie内容
    GET:获取GET请求中传递的参数
    POST:获取POST请求中传递的参数
    FILES:获取页面中传递的图片文件
    path: 获取当前请求的URL路径


    二、设置和获取cookie

    1.修改urls.py配置文件

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        url(r'^index/', views.index),
    
        url(r'^get_token/', views.get_token),
    ]
    

    2.设置cookie

    def index(request):
        res = HttpResponse('hello')
        res.set_cookie('token', '123123', 6000)
    
        return res
    ]
    

    3.获取cookie
    method:获取请求方式

    def get_token(request):
        if request.method == 'GET':
            token = request.COOKIES.get('token')
    
            return HttpResponse('获取令牌')
    

    三、注册功能

    1.修改urls.py配置文件

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        # 登录
        url(r'^login/', views.login),
    
        # 注册
        url(r'^register/', views.register),
    
        # 首页
        url(r'my_index/', views.my_index),
    ]
    

    2.注册功能代码

    def register(request):
        if request.method == 'GET':
            return render(request, 'register.html')
    
        if request.method == 'POST':
            # 1.先获取注册的账号和密码以及确认密码
            username = request.POST.get('username')
            password = request.POST.get('password')
            re_password = request.POST.get('re_password')
    
            # 2.判断用户名是否为空和是否已经被注册过
            if not username:
                # 用户名为空
                err_name = '用户名不能为空!'
                return render(request, 'register.html', {'err_name': err_name})
    
            user = MyUser.objects.filter(username=username).first()
            if user:
                # 已经存在该账号
                err_name = '该账号已被注册,请换一个账号注册!'
                return render(request, 'register.html', {'err_name': err_name})
    
            # 3.判断密码和确认密码是否相同
            if password and re_password:
                if password != re_password:
                    err_pwd = '密码和确认密码不一致,请重新注册!'
                    data = {
                        'err_pwd': err_pwd
                    }
                    return render(request, 'register.html', data)
    
            else:
                err_pwd = '密码不能为空!'
                return render(request, 'register.html', {'err_pwd': err_pwd})
    
            # 4.如果用户名不存在,且密码和确认密码相同,则实现注册,保存数据
            MyUser.objects.create(username=username, password=password)
            success = '注册成功!'
    
            # 实现跳转到登录页面
            return HttpResponseRedirect('/login/')
    

    四、登录功能

    1.产生随机令牌

    import random
    
    
    def get_cookie_token():
        s = '1234567890qwertyuiopasdfghjklzxcvbnm'
        token = ''
        for _ in range(20):
            token += random.choice(s)
    
        return token
    

    2.登录功能代码

    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.登录操作
            res = HttpResponseRedirect('/my_index/')
            token = get_cookie_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
    
    
    def my_index(request):
        if request.method == 'GET':
            # 判断token是否有效
            token = request.COOKIES.get('token')
            token_user = TokenUser.objects.filter(token=token).first()
            if token_user:
                return render(request, 'index.html')
            else:
                return HttpResponseRedirect('/login/')
    

    相关文章

      网友评论

          本文标题:day45-Django视图

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