美文网首页
Cookie——Django中使用HttpResponse(简易

Cookie——Django中使用HttpResponse(简易

作者: YellowTag | 来源:发表于2018-11-16 23:33 被阅读0次

    现在后端做项目的时候遇到了cookie的问题,然后决定登录的界面暂时使用cookie来验证登陆,先给出原来登录函数

    
    def login_user(request):
        if request.method=="POST":
            msg = 'success'
            req=simplejson.loads(request.body)
            username=req['username']
            password=req['password']
            try:
                user_a = User.objects.get(username=username)  # 这个设置是为了更详细的检查出错误来,因为这个地方get函数不会返回none,一旦找不到,便会给一个exception
                user = authenticate(username=username, password=password)  # 而authenticate就能返回一个none
                if user is not None and user.is_active:  # 不要用 password==password 我试过,就算密码正确也是不相等的,因为一个是hash str,一个是str
                    login(request,user)
                    return JsonResponse({'user_id':user.id,'msg':msg})
                    # 旧方法return redirect(reverse("get_profile", args=[user.id]))
                else:
                    msg = "请输入正确的密码"
            except Exception as e:
                msg = "用户不存在"
            return JsonResponse({'msg': msg, 'username': username, 'password': password})
        # return render(request,"log_login.html",locals())#locals()应该包括 login_form和msg
        get_token(request)  # 产生一个token
        return JsonResponse({'username': "", 'password': ""})
    

    (不要忘记import相应的类)

    这段代码返回给前端(Vue)的数据是JSON格式的,所使用的是

    JsonResponse
    

    这是Django中的一个返回JSON格式的类,传入一个python字典,返回的时候会自动转成JSON格式

    下面我们要来设置一个响应的头,而JsonResponse是不能实现的,那么我们就用到Django里面的一个类

    HttpResponse
    

    实际上,按照学习的顺序来讲,应该要先学这个类,在学习前后端交互的时候,就应该看看请求和返回这一块,而且JsonResponse其实是这个类的特殊子类

    那么我们不妨来看一下这个类(以下资料均来自官网)
    https://docs.djangoproject.com/en/2.1/ref/request-response/

    创建并初始化一个response

    from django.http import HttpResponse
    #首先我们声明了一个response对象,并且直接给了一个string参数给到这个类的constructor,那么response里面数据的返回就是一个字符串
    response = HttpResponse("Here's the text of the Web page.")
    #在下面我们设置了数据的类型,是"text/plian"
    response = HttpResponse("Text only, please.", content_type="text/plain")
    

    看到这里我们自然想,怎么样设置成JSON格式呢?
    首先参考这个网址:
    https://www.cnblogs.com/scolia/p/5635546.html
    我们试试能不能把content_type改成application/json

    response = HttpResponse("{'username':123}",content_type="application/json")
    

    使用postman查看得到的数据:


    注意这个很明显不是一个JSON格式的数据,就是一个字符串而已
    所以这样设置是不行的
    稍后会将怎么样设置成JSON格式

    设置响应头

    response = HttpResponse()
    response['Age'] = 120
    #删除响应头
    del response['Age']
    

    这个地方要注意的是不要把这个当做设置响应的content了

    设置响应体

    其实前面在用构造方法创建一个response的时候,已经设置了content,那么这里有没有什么方法来实现更改响应体的内容呢?
    因为很多时候我们要在最后做一个数据的设置

    方法一:

    查看官方源码

    @content.setter
        def content(self, value):
            # Consume iterators upon assignment to allow repeated iteration.
            if hasattr(value, '__iter__') and not isinstance(value, (bytes, str)):
                content = b''.join(self.make_bytes(chunk) for chunk in value)
                if hasattr(value, 'close'):
                    try:
                        value.close()
                    except Exception:
                        pass
            else:
                content = self.make_bytes(value)
            # Create a list of properly encoded bytestrings to support write().
            self._container = [content]
    

    发现这里面有一个setter方法,也就是意味着我们也许能够直接这样设置content

    response = HttpResponse("{'username':123}",content_type="application/json")
    response.content="string"
    
    postman请求到的数据

    有一点和容易注意到的是,这个content会被覆盖掉的

    方法二:
    response = HttpResponse()
    response.write("<p>Here's the text of the Web page.</p>")
    response.write("<p>Here's another paragraph.</p>")
    

    这个其实就是append了字符串在后面

    将数据设置成为JSON格式

    我们最后还是想用JSON的格式发送给前端啊,其实只要用一个函数就能解决

    simplejson.dumps({"username":123})
    

    这个函数把字典对象转换成为JSON格式的数据

    那么我们可以这样:

    response.content=simplejson.dumps({"username": 123})
    

    或者这样

    response.write(simplejson.dumps({"msg": 12}))
    

    然后我们试试在初始化的时候就使用:

    response = HttpResponse(simplejson.dumps({"msg": 12}))
    
    没有问题

    假如我们在content_type那边做一些改变:

    response = HttpResponse(simplejson.dumps({"msg": 12}),content_type="text/plain")
    
    response = HttpResponse(simplejson.dumps({"msg": 12}),content_type="application/json")
    

    发现并没有什么问题

    设置Cookie

    使用这个类里面的一个方法

    HttpResponse.set_cookie
    

    可以参考这个教程了解什么是Cookie
    https://www.cnblogs.com/andy-zhou/p/5360107.html

    然后我们在Django里面实现Cookie的使用
    这里只是单纯的使用cookie,并没有结合session
    参考教程:
    https://www.jb51.net/article/134322.htm

    
    @csrf_exempt
    def login_user(request):
        response=HttpResponse()                               #设置响应
        if request.method=="POST":
            msg = 'success'
            req=simplejson.loads(request.body)
            username=req['username']
            #username = req['username']
            password=req['password']
            try:
                user_a = User.objects.get(username=username)  # 这个设置是为了更详细的检查出错误来,因为这个地方get函数不会返回none,一旦找不到,便会给一个exception
                user = authenticate(username=username, password=password)  # 而authenticate就能返回一个none
                if user is not None:  # 不要用 password==password 我试过,就算密码正确也是不相等的,因为一个是hash str,一个是str
                    login(request,user)
                    response.set_cookie("username", username, 60000)
                    response.set_cookie("password", username, 60000)
                else:
                    msg = "请输入正确的密码"
                response.write(simplejson.dumps({"msg": msg}))
                return response
            except Exception as e:
                msg = "用户不存在"
                response.write(simplejson.dumps({'msg': msg}))
                return response
        get_token(request)  # 产生一个token 用于csrf验证
        return response
    
    

    如果请求是get 那么就返回一个空的Response
    如果是post,假如登录信息错误,我们会返回一个msg
    如果登录成功,那么我们就返回一个cookie

    后面是cookie的验证,现在还没有写
    登录成功之后前端取到主页面,然后带着cookie去拿信息,这个时候做个判断就ok

    前后端登录验证
    图片来源:https://segmentfault.com/q/1010000009751566

    相关文章

      网友评论

          本文标题:Cookie——Django中使用HttpResponse(简易

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