django知识点回顾
对django优缺点的了解:优点:自带大量常用框架和工具(auth认证、权限管理等)、强大的数据库管理框架orm、以及独特的app设计理念;缺点:因为封装过多导致改动会比较困难、当流量过大后随之而来的就是性能问题
对比django、flask、tornado:
django:适合开发全栈网站,以及博客/管理类等需求复杂且多的网站,适合小团队快速开发
flask:相比于django更灵活,易用,快速扩展成复杂的应用程序以及微服务
tornado:因为拥有异步非阻塞IO处理方式,相比其它两类拥有更出色的抗负载能力、适合需要性能比较高的项目
WSGI协议规范:web应用请求处理过程:用户发起请求 -> web服务器(nginx、uWSGI等)接收转发给web应用程序(django、flask等)-> 结果再发给web服务器 -> 给用户展示到浏览器上;在这个整套流程中web服务器以及web应用程序都是多样的,为了规范他们之间的数据交流,就产生了WSGI协议
uWSGI和uwsgi:uWSGI是web服务器,uwsgi是uWSGI自有的协议,uWSGI实现了WSGI、uwsgi、http等协议,用来直接与web应用程序交互、而在用户与uWSGI之间存在nginx是因为1. nginx不能与web应用程序交互,2. uWSGI处理静态文件能力弱
Gunicorn和gevent:Python Web领域还有一个遵循WSGI通信规范的Gunicorn(支持每个worker有多个线程)服务器,而gevent是异步处理(协程),通过gunicorn+gevent可以处理高并发问题(多线程+协程)
django请求的生命周期:
MTV和MVC:
MTV是django借鉴MVC模式设计:M(Model)负责业务对象与数据库(orm)、T(template)展示页面、V(View)负责业务逻辑和调用view和template
MVC:M(Model)、V(View)负责与用户交互、C(controller)接收用户调用模型和视图完成请求
django内置组件:admin(超级用户来管理用户和数据库)、paginator(分页组件)、form、modelform(两个都是管理页面初始化的,内含钩子函数)、model(数据库相关)等
django的中间件:session、cache、csrf protection、common、X-Frame-Option等
django中间件的五个方法:process_request请求刚进来、process_view路由匹配后(可用于csrf认证)、process_exception异常处理、process_template_response页面渲染、process_response返回有相应
django的request对象:django会将http中的数据打包成HttpRequest对象,也就是request,在WSGIhandler时的__call__时进行封装,里面覆盖许多信息与操作,method、GET、POST、content_type、head、body、path、COOKIE、FILES、session、user
django的重定向:最初的是HttpRespond类,子类HttpResponseRedirect减少了许多输入(只需传入url),django中快捷函数为redirect(1.传入模型,得含有get_absolute_url方法,2.传入url名称和参数,3.传入url),也可以通过基于类的视图继承RedirectView,在urls.py中的as_view中传入url
其中涉及状态码:301永久重定向、308(与307一样,不过是针对永久重定向)、302found(临时重定向,不确保POST重定向到GET) 、303(允许任何重定向到GET)、307(不将POST重定向到GET)
web安全:
SQL注入:通过用户输入数据的时候自带sql语句条件从而达到其他效果,预防:1.使用django自带的orm,2.参数查询的时候优化
XSS跨站脚本攻击:反射型(非持久):恶意第三方需要恶意url链接,当用户点击时触发,一般出现于搜索;存储型(持久):无需链接,恶意脚本被保存到服务器中,当用户访问恶意页时自动执行恶意代码,防范:前端渲染将代码和数据分开,规范设计js,html转义
CSRF跨站请求伪造:利用服务端对用户客户端的信任,第三方利用用户登录自带的cookie并在没有退出的情况下访问恶意网站,返回恶意代码给服务端,从而造成威胁
csrf token:用户登录后生成的数据加密字符串,一般存在cookie中,当发起请求时携带token,后端对cookie和request拦截器中的csrftoken进行反向散列认证
django的csrf防护:通过中间件CsrfViewMiddleware实现,
基于FBV:不进行认证用csrf_exempt装饰,认证用csrf_protect装饰;基于CBV:在类上加装饰、在类中dispatch前装饰、在urls.py中加装饰
form提交时:在form表单下添加{%csrf_token%};ajax提交:1.在请求中加入X-CSRFtoken:用户cookie中的csrf-token,2.通过jQuery中的ajaxSetup方法,
cookie和session:cookie在每次用户登录时存储在浏览器上的键值对、session是存储在服务端数据库的随机字符串、用来比对cookie和session
django中的orm方法:all、filter、first、exits、get、order_by、exclude、count、values、values_list
F和Q:F查询某字段的一列值,Q执行更复杂的查询,Q(条件)| / & Q(条件)
select_related和prefetch_related:处理外键问题,都是用来减少SQL查询次数,第一个是一对一,第二个是多对一或多对多
values和values_list:values字典、values_list元组
django的websocket:由于http是无状态的短链接,无法实时更新数据,要想做到类似于b站直播聊天的功能,有三种实现方式:轮训(每隔一段时间向后端发请求,压力大、有延迟)、长轮训(将发过来的请求阻塞一段时间再返回,如果有数据立即返回,服务端需求高、无延迟)、websocket(在客户端和服务端创建连接,实现双向通信)
使用要求:服务端想要向客户端推送数据
底层原理:建立在http协议之上,连接、握手(客户端发送信息,后端特定处理/验证后返回)、收发数据、断开连接
握手:客户端向服务端发送:http请求头有个加密websocket-key,服务端接收后与magic string(固定)拼接后进行hmac1加密,再base64加密,再返还比较
收发数据:由于服务端发送的数据加密,客户端就需解密,解密需要从密文中根据字节payload len筛选出masking后面的数据,再根据官方的解密方法得出
使用方法:django默认不支持websocket,1.需安装channels,2.注册app-channels,3.添加ASGI_application配置,4.修改asgi.py文件(asgi相当于wsgi+异步+webSocket),5.添加以及配置routing和consumers文件(在http中有urls.py和view,在websocket中有routings.py和consumers.py),而consumers的类中的方法有websocket_connect(self,message),websocket_receive(self,message),websocket_disconnect(self,message)
流程:当访问一个url时,路由分配给视图(view),view中的函数调用页面(html),html的js样式中创建新WebSocket对象,WebSocket对象指向ws://发送websocket请求,调用asgi.py,asgi.py规定websocket请求调用routings.py分配,routings.py根据websocket请求的地址进行路由分配到consumers,在js中有:socket = websocket对象,连接后自动触发的函数socket.onopen = function(){},以及接收到消息时触发函数socket.onmessage = function(){},以及断开连接时触发socket.onclose = function(){},另外还有socket.send()是客户端向服务端发送请求(前端向后端),self.send()是服务端向客户端发送请求(后端向前端),socket.close()断开连接,
如果想创建群聊,(1)手动(效率低):在consumers中创建用户列表,每连接一个,向列表中添加一个self
(2)使用channels自带的:使用channel layers,在setting中配置CHANNEL_LAYERS,默认数据放在内存;使用channels-redis,配置CHANNEL_LAYERS,放在redis里
django中的Form和ModelForm:
form:作用:根据字段生成html标签、对用户发送的数据效验、有选择的保留用户的输入、可以通过attr设置前端样式,注意:对于choice字段是静态字段无法实时更新,需重写构造方法或者调用form里的form_model中的ModelMultipleChoiceField字段并传入queryset参数
ModelForm:作用:同form,多了通过save操作数据库
两种类内都提供了全局钩子函数以及局部钩子函数
在django的orm执行原生sql:1. 通过orm的raw方法传入sql语句,2.通过游标,导入connection对象,调用获取connection.cursor游标对象,调用execute方法传sql语句
django的orm读写分离:1. 在setting中配置连接多个数据库地址,在每个app的model中创建数据库并migrate --database=库名;
2. 手动读写分离:用orm中的using方法在调用数据库的时候指定数据库;
自动读写分离:创建py文件,在其中新建数据库路由类,然后再settings中配置DATABASE_ROUTERS=['路由类的路径 . 类名']
在路由类中定义四个方法:db_for_read(self,model,**hints),db_for_write,allow_relation,allow_migrate
定义最好主库写,从库读,在read可以return random(多个数据库),其他方式还有多app对应多数据库
django内置的缓存机制:Memcache缓存(使用python-memcached模块)、数据库缓存、文件缓存、本地内存缓存(这三种都需在setting中配置);使用:在视图、路由、模板中都可使用
django-redis:使用redis缓存,在settings配置,配置内容如数据库类似,在使用的时候启动redis服务,然后在需要的视图中导入django-redis的get_redis_connection对象,里面有set和get方法
django模板中filter和simple-tag:针对的是template模板,其中有如{{变量}}(filter)以及{%内容%}(tag标签)等相当于引入等相关的对象,filter类似于{{变量 | 过滤条件(如lower/upper大小写,join字符连接)}}以及simple-tag中也可以写代码{%函数名 参数1 参数2 ....%}参数没有限制,而filter有限制
django-debug-toolbar:1.安装,2.在settings的app里注册‘debug_toolbar’,3.在中间件配置‘debug_toolbar.middleware.DebugToolbarMiddleware’,4.在urls.py中设置if settings.debug:import debug_toolbar 内容 5.调试页面展示内容:判断加载当前页面总共花的时间、查看当前界面执行的SQL语句、当前请求头和响应头信息、当前界面的重定向信息等
django单元测试:不太清楚
django的orm:主流都是code first(先写代码,根据代码创建数据库表结构)、其次还有db first(数据库先生成表结构,然后生成类,根据类操作数据库)
django的orm性能优化:orm取出数据库的queryset是会在内存存储一段时间,再次查询会快,所以尽量一次性取出需要的数据;适当利用mysql优化的机制
django的contenttype:1.当我们创建了新的model并执行数据库迁移后,ContentType表中就会自动新增一条记录;2.一张表和多个表FK关联,并且多个FK中只能选择其中一个或其中n个时,可以利用contenttypes
接口的幂等性:同一个接口发送多个请求,确保只能有一个请求成功执行;原因:网络波动、重复点击、页面重复刷新等
保障方法:token认证、数据库使用唯一索引防止脏数据、乐观锁
RPC远程过程调用协议:restful是RPC的一种,详细不太理解
将dict转换为url:使用urlencode(字典),url后面的参数形式会添加?键=值
什么是跨域:域由协议(http/https)、域名(www(子域名).baidu.com)、端口号组成,当这三部分都相同才是同域,如果不是,则为跨域,由于浏览器的同源策略,非同源域会禁止读取cookie、无法解除DOM、无法发送ajax请求
解决方法:1.nginx反向代理,通过在a域名里请求地址反向代理到b域,使浏览器认为在访问a域;2. 基于HTML5的websocket协议,该协议允许跨域请求;3.jsonp,利用了 script 不受同源策略的限制,易收到xss攻击
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?