现在后端做项目的时候遇到了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
网友评论