首页 > 其他分享 >django高级

django高级

时间:2023-09-07 19:13:55浏览次数:32  
标签:请求 用户 中间件 校验 高级 token django

jwt源码

1.jwt详解

jwt的全称是json web token, 一般用于用户认证
# jwt的原理是什么?

用户在第一次登录的时候,会将用户名、密码等信息传到我们的服务器上进行身份验证,验证成功后,服务器会存在密钥,对用户信息进行加密签发生成jwt,并返回给用户,用户将jwt存储下来,然后在下一次登录的时候,向服务器发送jwt,服务器会提取发送过来的jwt前面两段和服务器中存放的密钥重新生成jwt,两个jwt做比较,如果相同,说明用户登录了,如果不相同,说明jwt被篡改了,阻止用户登录。

# 使用  # token串 头,载荷、签名
    	公司做项目时主要用的jwt,我觉得jwt的优点是可以不在服务端存数据,其实就是token的加密方案,签发给前端一个token字符串,以后只要访问有认证的接口,就需要带这个,然后校验的时候,后端因为不存token串,所以从数据库提取出用户信息生成token串,再去token正不正确,过没过期 ,只要校验通过就ok,不通过就不让访问,比session的优势就是不在服务器存信息了.节省服务端资源.

 jwt的实现原理:
     - 用户登录成功之后,会给前端返回一段token。
     - token是由.分割的三段组成。
         - 第一段header(头):类型+算法+base64url加密
         - 第二段paylod(载荷):用户信息+超时时间+base64url加密
         - 第三段sign(签名):hs256(前两段拼接)加密 + base64url
     - 以后前端再次发来信息时
         - 超时验证
         - token合法性校验
            
 优势:
     - token只在前端保存,后端只负责校验。
     - 内部集成了超时时间,后端可以根据时间进行校验是否超时。
     - 由于内部存在hash256加密,所以用户不可以修改token,只要一修改就认证失败

django面试题

1.反向解析

在软件开发初期,url地址的路径设计可能并不完美,后期需要进行调整,如果项目中很多地方使用了该路径,一旦该路径发生变化,就意味着所有使用该路径的地方都需要进行修改,这是一个非常繁琐的操作。

# 解决方案
	就是在编写一条url时,通过参数name为url地址的路径部分起一个别名,项目中就可以通过别名来获取这个路径。以后无论路径如何变化别名和路径始终保持一致。
    
上述方案中通过别名获取路径的过程称为反向解析。

2.路由分发

随着Django项目功能的增加,app会越来越多,路由也越来越多,每个app都会有属于自己的路由,如果再将所有的路由都放到一张表路由中,会导致结构不清晰,不便于管理,所以我们应该将app自己的路由交由自己管理,然后在总路由表中做分发,具体做法就是在主urls里面,使用include模块,将路由分发到各个app的urls里面
在浏览器里面访问路径时会先匹配到总路由,再由总路由下发到各个app里面进行路由匹配

3.为什么选用uwsgi

# 为什么选用uwsgi,不选择别的?
    公司选型就这个,当时觉得比较困惑,解决后也比较简单
    uwsgi是一个web服务器
    uWSGI是一个uwsgiweb服务器的协议
    WSGI是python的web协议,只要python的框架都需要遵循WSGI 协议
    CGI是通用网关接口,所有的web都要遵循.WSGI其实也是遵循的CGI协议
    FastCGI   fast翻译过来就是快,其实就是和名字一样对CGI做了一个加速

# 公司服务器部署了几台?
    目前的话是一台,用docker部署的,做了一个镜像,后期想扩展的话可以很快的拉起来进行扩展

4.django请求生命周期

	在浏览器输入url时,浏览器会生成请求头和请求体发送给服务端,请求头和请求体中会包含浏览器的action,统称为"get和POST"体现在url中.
	url经过django的wsgi,再到django的中间件,最后经过url到路由映射表,在路由中进行一条条匹配,一旦匹配成功就不再继续,之后进入视图层,视图层到model层,model层经过orm到数据库里面拿取数据做成字符串返回给浏览器,渲染给用户

5.MVT MVC架构

mvc架构model template controller(控制层)
	用的是松耦合的方式连接在一起     (松耦合指的是客户端和远程服务并不知道对方是如何实现的,客户端和服务之间的通讯由消息的架构支配,只要请求符合协商的架构,客户端或者服务的实现就可以根据需求进行更改,而不必担心会破坏对方)
    模型负责业务对象与数据库的映射(ORM)
    
# 一、MVC
	著名的MVC模式:方便解藕
  所谓的MVC就是把web应用分为三层
M:model,模型,就是数据模型,负责数据的存取;
V:view,视图,负责页面的展示逻辑;
C:controller,控制器,负责业务逻辑的处理;

# 二、MVT
M:model,模型,就是数据模型,负责数据的存取;
V:view function,视图函数,负责业务逻辑的处理;
T:template,模板,负责页面的展示逻辑;

MTV其实就是MVC架构,model,template,view还需要一个url路由分发器
注:核心目的就是为了解耦,提高开发效率

6.Django的自定义中间件

# django中自定义中间件是什么?
	中间件是介于request和response处理之间的一个处理过程,能在全局上改变django的输入输出,认证,频率限制

# django自定义中间件的应用
解决前后端分离,跨域问题(CORSMiddleWare),定义全局异常捕获,验证是否登录啊,处理每次访问日志或者记录报错日志啊等等...
自定义中间件必须继承MiddlewareMixin (迷的我儿迷信)
不过跨域问题我们开发的时候选择的是第三方的中间件,因为Django原本的csrf想实现简单的局部禁用,直接停掉的话系统安全担心会有问题.而第三方中间件用的是django-cors-headers.只要配置好就行了.使用起来更加的方便


# 中间件的执行流程
1.执行完所有的request方法然后到达视图函数
2.执行中间件的其他方法
3.经过所有response方法返回给客户端.


# 列举django中间件的5个方法?
process_request : 请求进来时,权限认证
process_view : 路由匹配之后,能够得到视图函数
process_exception : 异常时执行
process_template_responseprocess : 模板渲染时执行
process_response : 请求有响应时执行

7.CBV和FBV

FBV就是一个url对应一个函数
CBV就是一个url对应一个类

# 在python中使用CBV的好处:
    1.提高代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
    2.可以用不同的函数针对不同的HTTP方法处理,而不是通过if判断,提高代码的可读性

8.cookie session 和token

# cookie 和session的区别?
1.cookie 数据存在客户的浏览器上,session数据放在服务器上
2.cookie 不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
	考虑到安全问题应该使用session
3.session会在一定时间内保存在服务器上,当访问增多时,会比较占服务器的性能
	考虑到减轻服务器性能方面,应当使用cookie
4.单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie.
5.所以我个人觉得将登录信息那些重要的信息存放在session
	其他信息如果需要保存的话可以放在cookie
# token是什么?
token是服务端将用户信息经过base64url编码过后传给客户端,每次用户请求的时候都会带上这个信息,服务端拿到这个信息进行解密后就知道这个用户是谁了,这个方法就是jwt了 token类似一个令牌,无状态的,服务端所需要的信息被base64编码后放到token中,服务器可以直接解码出其中的数据
# token的优点是什么?
可以通过url,post参数或者是在HTTP头当成参数发送,因为数据量小,传输速度也很快.因为包含了用户信息,也可以起到避免多次查询数据库,因为token串是以json的形式保存在客户端的,所以jwt是跨语言的,不需要在服务端保存会话信息,比较适用在分布式微服务.

9.orm中间件

# orm是什么?
orm 全称是object relational mapping,通过orm实现使用操作对象的方式来操作数据库中的数据

orm其实是用python语句操作数据库的中间件,做简单的对象定义,他就能自动生成数据库结构,以及全功能的管理后台.
目的是为了能让不懂sql语句的人通过django的orm也能操作数据库.
缺点是sql语句封装死了,有时候查询很慢.

# 列举django orm 中所有的方法(QuerySet对象的所有方法)
all(): 查询所有结果
filter(**kwargs): 它包含了与所给筛选条件相匹配的对象。获取不到返回None
get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个。获取不到会抱胸
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
order_by(*field): 对查询结果排序
reverse(): 对查询结果反向排序
count(): 返回数据库中匹配查询(QuerySet)的对象数量。
first(): 返回第一条记录
last(): 返回最后一条记录
exists(): 如果QuerySet包含数据,就返回True,否则返回False
values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系 model的实例化对象,而是一个可迭代的字典序列
values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
distinct(): 从返回结果中剔除重复纪录

# orm查询优化
# only和defer
only 只有only括号内的字段在查询出的对象中,查询这个字段时不会去走数据库,查询其他字段需要重走数据库查询操作
defer 想过和only相反,只有在查询defer括号内的字段时才会走数据库查询操作

only是指定查询的字段

only是只查某几个

defer是除了写的那几个


# select_related和prefetch_related
select_related与prefetch_rellated查询时均不走数据库操作,因为数据全都封装在得到的对象中了.
select_related:内部就是连表操作,将关联后的大表内的数据全都封装到对象中
	注意:select_related括号内只能一对一或者一对多关系的字段,放到多对多关系或者非外键字段就会报错
prefetch_related:内部就是子查询,同样也会将数据全都封装到对象中
select_related与prefetch_related各有优缺点,具体用谁要结合实际情况

10.DTL模板语法

模板语法,用在前后端混合的业务场景上,可以把前端的数据直接通过模板语法从后端传上去
在html使用
{{ 变量名 }}
{% 代码块 %}
{{ 变量名|过滤器 }}

12.auth模块

auth模块是django框架自带的功能模块,是对登录认证的一种封装,使用auth之后可以很轻松去验证用户的登录信息是否存在于auth_user表中(执行完迁移命令之后在数据库中自动生成的表).除此之外Auth还可以对session做一些封装,方便我们校验用户是否已经登录

13.RBAC模式

# RBAC是什么?
根据权限思路创建用户表,角色表,权限表三个模型models  
通俗来讲就是:用户是平台用户,角色就是用户要扮演的角色,这个角色有什么权限.
    比如一篇文章,发文章的用户就是管理员,有对这篇文章增删改查的权限,而其他用户只有读的权限.
# 简述下Django的RBAC?
Django的权限系统可以认为是轻量级的RBAC系统,他里面有一个组,他这个组对应了模型中的角色.通过将权限分配给组,再将用户分配到组中,从而实现了授权的过程.不过django中还支持直接对用户授权,对于一些特殊情况还是有点作用的.

14.F/Q查询

他属于django-orm中的聚合查询,

F用来取出某个字段对应的值,可以用来运算,也就代表了使用update()修改操作的时候可以使用F()进行查询并更新

Q对对象的复杂查询,用来构造  或|   与&     非~ 的条件语句

15.django如何实现websocket?

django实现websocket使用channels。
channels通过http协议升级到websocket协议,保证实时通讯。
也就是说,我们完全可以用channels实现我们的即时通讯,而不是使用长轮询和计时器方式来保证伪实时通讯。
他使用asgi协议而不是wsgi协议,他通过改造django框架,使django既支持http协议又支持websocket协议。

16.自定义命令

# 自定义命令是什么?
使用django开发时我们常用那个python manage.py 这个命令模式,他自带有runsever,migration,migrate这些,
有时候我们需要为django启用一些定时任务,可以通过django的manage.py添加自定义命令来实现

# 怎么使用?
我们只需要在创建好的app的根目录创建文件名为management的目录,在里面再创建一个commands目录,并且在两个目录下都要创建init的Python文件,创建好就可以在commands目录下添加脚本文件,文件名就是manage.py的命令名.

17.django写原生sql

raw:  # (弱)
    raw方式查询出来的一个对象,通过对象 点 的方式取出数据.
    models.表名.objects.raw("sql语句")
    或者models.表名.objects.raw("sql语句",[参数1,参数2])
# 真正的原生SQL
connection执行sql

from django.db import connection
def book_list(request): 
  # 真正的原生sql, 
  cursor = connection.cursor() 
  print(type(cursor)) 
  cursor.execute("select * from app01_book where id=%s", [1, ]) 
  raw = cursor.fetchall() 
  print(raw) 

18.什么是上下文?

application 指的就是当你调用app = Flask(name)创建的这个对象app;
request 指的是每次http请求发生时,WSGI server(比如gunicorn)调Flask.call()之后,在Flask对象内部创建的Request对象;0.
application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request

1.请求上下文
记录一些和请求有关的数据, 包括request和session两个变量
request封装了HTTP请求的内容,针对的是http请求。
session用来记录请求会话中的信息,针对的是用户信息。

2.应用上下文
记录一些和应用有关的数据, 包括current_app和g两个变量
current_app:
会自动引用创建的Flask对象, 需要在项目的其他文件中使用app时, 应该通过current_app来获取, 可以减少循环导入问题
g变量:
flask给开发者预留的一个容器, 用于记录自定义数据
g变量每次请求会重置数据
g使用场景: 1> 在钩子函数和视图函数之间传递数据 2> 函数嵌套调用时传递数据

19.有名分组无名分组

1.有名分组
给一段正则表达式起一个别名。
匹配的时候,会将括号内正则表达式,匹配到的内容,当做关键字参数,传递给对应的视图函数
2.无名分组
在路由匹配的时候给某段正则表达式加了括号。
匹配的时候,会将括号内正则表达式,匹配到的内容,当做位置参数,传递给对应的视图函数

20.列举django中间件的5个方法?

process_request : 请求进来时,权限认证
process_view : 路由匹配之后,能够得到视图函数
process_exception : 异常时执行
process_template_responseprocess : 模板渲染时执行
process_response : 请求有响应时执行

21.django的request对象是在什么时候创建的?

class WSGIHandler(base.BaseHandler):
    request = self.request_class(environ)
请求走到WSGIHandler类的时候,执行__cell__方法,将environ封装成了request

22.django中csrf的实现机制

第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;
第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx}
第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

23. Django本身提供了runserver,为什么不能用来部署?(runserver与uWSGI的区别)

1.runserver方法是调试 Django 时经常用到的运行方式,它使用Django自带的WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。
2.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。
uWSGI具有超快的性能、低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署 。
相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

24.钩子函数和中间件

列举Django中间件常用的钩子函数以及中间件的应用场景。
init():初始化函数,运行Django将自动执行该函数。
process_request():完成请求对象的创建,但用户访问的网址尚未与网站的路由地址匹配。
process_view():完成用户访问的网址与路由地址的匹配,但尚未执行视图函数
process_exception():在执行视图函数的期间发生异常,比如代码异常,主动抛出404异常等
process_response():完成视图的执行,但尚未将响应内容返回浏览器。

中间件不仅能满足复杂的开发需求,还能减少视图函数或视图类的代码量,比如编写Cookie内容实现反爬虫机制、微信公众号开发商城等。
默认的校验、自定义正则规则的校验、自定义校验函数、局部钩子,这些校验都是针对单个字段的校验,而全局钩子可以对多个字段进行校验
校验通过之后,都可以通过obj.cleaned_data获取校验成功后的数据,全局钩子也一样
如果校验不通过,都可以通过obj.errors获取全部的错误信息,全局钩子也一样
当校验不通过时,其他的校验可以通过  obj.字段名.errors  来获取每个字段自己的错误,但是全局钩子却不可以,如果全局钩子也想让每个字段获取自己的错误,则需要通过 add_error()方法来实现


# 局部钩子:
在Fom类中定义 clean_字段名() 方法,就能够实现对特定字段进行校验。(校验函数正常必须返回当前字段值)

 def clean_name(self):
        pass
        name = self.cleaned_data.get('name')
        if name=='admin':
            raise ValidationError('admin是超级管理员,不能注册!')#这个错误会直接扔进该字段的错误类别中:name.errors
        return self.cleaned_data.get('name')

全局钩子:
在Fom类中定义 clean() 方法,就能够实现对字段进行全局校验,字段全部验证完,局部钩子也全部执行完之后,

执行这个全局钩子校验(校验函数正常必须返回当前对象的结果值)。

 # 全局钩子

    def clean(self):
        register_dict = self.cleaned_data
        print('>>>>>', register_dict)
        if register_dict.get('password') != register_dict.get('r_password'):
            raise ValidationError('密码不一致!')#由于是在全局非字段内校验,这个错误会扔给全局对象self中:self.erors
            self.add_error('r_password', '两次密码不一致!')#可以使用对象的add_error('字段','错误提示')进行指定
        else:
            return self.cleaned_data

标签:请求,用户,中间件,校验,高级,token,django
From: https://www.cnblogs.com/liyuanxiangls/p/17685831.html

相关文章

  • 杰哥教你面试之一百问系列:java中高级多线程concurrent的使用
    目录问题1:什么是ConcurrentHashMap?它与HashMap的区别是什么?问题2:什么是CopyOnWriteArrayList?它适用于什么样的场景?问题3:什么是BlockingQueue?它的作用是什么?举例说明一个使用场景。问题4:什么是Semaphore?它如何控制并发访问?问题5:什么是CountDownLatch?它适用于什么场景?问题6:什么是Cyc......
  • 智能合约编写高级篇(二)区块哈希介绍
    本文档从区块哈希基本概念出发,详细介绍了中移链的区块哈希交易接口和应用方向。适用于EOS区块链智能合约高级开发人员,熟悉如何获取当前发生交易所在的区块号和区块哈希前缀,并通过Tapos机制验证交易的有效性。01概述(一)哈希算法哈希算法是可以将任意长度的二进制数据映射为固定长度二......
  • Android并发编程高级面试题汇总(含详细解析 十八)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • 2023年9月软考高级信息系统项目管理师认证报名找弘博创新
    信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。信息系统项目管理师,属于软考三个级别中的“高级”。  【报考要求】 不设学历与资历......
  • ElasticSearch系列——查询、Python使用、Django/Flask集成、集群搭建,数据分片、位置
    @目录Elasticsearch之-查询一基本查询1.1match查询1.2term查询1.3terms查询1.4控制查询的返回数量(分页)1.5match_all查询1.6match_phrase查询1.7multi_match1.8指定返回的字段1.9sort结果排序1.10range范围查询1.11wildcard查询二组合查询2.1bool查询2.2简单过滤......
  • Django-SQL Injection Vulnerability (CVE-2019-14234)
    复现环境:Vulhub环境启动后,访问http://192.168.80.141:8000即可看到Django默认首页漏洞复现首先登陆后台http://192.168.80.141:8000/admin/,用户名密码为admin、a123123123。登陆后台后,进入模型Collection的管理页面http://192.168.80.141:8000/admin/vuln/collection/:然后......
  • Rust-高级进阶
    Rust高级进阶生命周期进阶生命周期约束通过形如'a:'b的语法,可以说明两个生命周期的长短关系。'a:'b这种情况说明生命周期'a>='b。structDoubleRef<'a,'b:'a,T>{r:&'aT,s:&'bT}T:'a类型T必须比'a活得要久:st......
  • Django中JSONField的模糊查询
    项目需求多个条件并联模糊查询 筛选条件中需要使用OR查询于是用Q对象查询先说结果使用字段名__键名__icontains=keyword解决#客户地址表classUserAddress(models.Model):"""用户地址表region所在地区{"address":"详细地址",......
  • pycharm打开django项目
    1、file-open,用pycharm加载django项目2、打开后,点击setting配置环境   file--setting--PythonInterpreter--配置python解析器    3、找到django项目的manage.py文件,运行manage.py文件4、点开配置,parameters:runserver           ......
  • Django admin 添加操作记录
    1:引入日志模块fromsimple_history.adminimportSimpleHistoryAdmin2:admin类继承 SimpleHistoryAdmin 3:对应model添加字段历史记录字段history=HistoricalRecords(excluded_fields=['user','create_time','update_time'])......