美文网首页
Django学习整理

Django学习整理

作者: YellowTag | 来源:发表于2020-02-27 11:05 被阅读0次

这篇文章不是给初学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单位是秒

相关文章

网友评论

      本文标题:Django学习整理

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