这篇文章不是给初学Django的人看的,只是我在整理一级项目的时候遇见的一些问题和知识点的记录
1.related_name
在模型写的时候我们有一个字段就是related_name, 这个不是verbose_name, 他的作用是用于检索方面,我们在检索某个作者的作品的时候,会检索作品表,然后匹配外键是否为该作者,这样就能得到期望的作品
但是有个更简便的写法,直接从作者那里写(不过我认为底层还是检索的作品):
book = person.book_set.all()
//book = person.类名_set.all()
如果在book类中的外键写了related_name字段,那么我就可以用这个字段来代替查找:
related_name='person_books'
person.person_books.all()//查询
2.DateField
如果是前后端分离的话,一定要注意DateField给过来的格式是yyyy-mm-dd
不然后端会报错
3.获取POST数据
在Django中,如果前端传过来的数据是form-data
格式,在获取数据的时候我们一般要:
req = request.POST
request.POST就是表单中的数据,是一个QueryDict
那么request.body是什么呢?
request.body
其实也是获取请求体里面的数据,但是是一个字符串内容,如果前端用表单类型传过来,你用json.loads()就会出错,因为这个字符串不是json格式。
那如果前端传过来application/json
格式的话,就可以用reqeust.body获取字符串内容,然后将其转为字典(json.loads),那如果用request.POST呢?也会报错的,因为这个字符串的格式不是原来的键值对格式,而是json格式,那么Django就转换不了
总结:
- form-data 就只能用 request.POST
- application/json 就只能用 request.body 然后转为字典
4.获取GET数据
一般而言用GET请求很少用请求体,虽然我还没研究过HTTP协议里面各个方法的区别,但是GET方法最好在请求体里面什么都不放,参考:
https://my.oschina.net/airship/blog/3081424
获取Query String里面的内容,Django里是这样:
request.GET
得到一个QueryDict对象,里面都是URL里面带的参数
然后GET请求体里面的东西在用reqeust.GET是获取不到的,只能:
request.body
得到字符串内容
总结:
1.GET请求体一般不放东西,要获取请求体内的东西,只能用request.body
2.GET请求的参数获取是 request.GET
3.POST请求获取请求体是request.POST
,也可以用request.body
可以参考官网:https://docs.djangoproject.com/en/3.0/ref/request-response/
整理出的request和response对象常用方法
5.Cookie,Session
Django用来进行会话跟踪的手段,还有一种token,这里不讲。
这两种手段都是用来记录状态的,是对HTTP无状态的一种扩展。
Cookie是保存在客户端的,我们这样来理解Coookie,它就是一串字符,是一种凭证,客户端登录服务器之后,服务器发送这个凭证给客户端,下次客户端访问服务器的时候,直接把这个凭证show出来,服务器确认后,就能让客户端访问资源,而无需重复登录。
一般,我们可以把用户名或者用户id保存在Cookie里面,这样服务器就知道这个凭证对应的客户端信息了,但是这样子的凭证未免也太脆弱了吧,Cookie是明文的,如果我们仅仅就是放一个uid进去,用户如果进行伪造怎么办呢? 那他不就可以用其他人的账号了?
所以在Django里面我们一般要加盐,加盐就是一种签名手段,比如说用户1和用户2,我们对Cookie加盐之后,用户1的Cookie:uid1 xxxxxxxxx
, 用户2的Cookie:uid2 xxxxxxxxx
后面的xxxxxx就是用户的签名(就是对应用户的特定字符串,之所以说签名,因为这个就好像是用户自己签名一样),如果居心不良的用户想要伪造,比如说用户1,想要访问用户2的资源,虽然可以改为uid2
,但是用户1没有后面xxxxx
这么一串用户2正确的签名,服务器是不会通过的
签名的原理我也不太清楚,类似一种哈希函数?
再次强调,签名不是加密,Coookie还是可以在客户端看到的,所以一般Cookie不要存敏感信息(或者可以自己进行加密然后再发送)
(参考:https://segmentfault.com/q/1010000015154576?utm_source=tag-newest)
Session和Cookie的最大区别就是,Session存放在服务器端,也是键值对,这个key是一串随机字符串,value就是要存的用户信息,客户端还是要存放sessionid(即key)到本地,然后凭借这个,服务器端就搜索是否有这么一串随机字符串,如果有就ok了
Cookie的使用:
response = HttpResponse()
response.set_signed_cookie('is_logged',user.id,salt="wobuzhidaoyongshenmejiamisuanfabijiaohaozLPQ",max_age=24*3600*7)
解释:
set_signed_cookie(key,value,salt,max_age)
max_age单位是秒
网友评论