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攻击

posted @   weakxy  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示