15.Django总结

文章目录

    • 1.Django创建项目的命令
    • 2.MVC,MVT的理解
    • 3.Django中间件的使用
    • 4.WSGI,uWSGI服务器 和 uwsgi协议
    • 5.nginx和uWISG 服务器之间如何配合工作的
    • 6.django开发中数据库做过什么优化
    • 7.Python中三大框架各自的应用场景
    • 8.django如何提升性能(高并发)
    • 9. 什么是restful api谈谈你的理解?
    • 10 什么csrf攻击原理,如何解决
    • 11.Django中的cookie和session
    • 12.简述Django下的(内建的)缓存机制
    • 13.Django HTTP请求的处理流程
    • 14.Django重定向你是如何实现的,用的什么状态码
    • 15.电商网站库存问题
    • 16.什么是反向解析
    • 17.ORM
    • 18.Restful Api

1.Django创建项目的命令

django-admin startproject 项目名称
python manage.py startapp 应用 app 名

2.MVC,MVT的理解

  • mvc

    • Model:模型,和数据库进行交互

    • View:视图,生成Html

    • 页面

    • Controller:控制器,接收请求,进行处理,与M和V进行交互,返回应答

      在这里插入图片描述

  • mvt

    • Model:模型,和数据库进行交互
    • View:视图,接收请求,进行处理,与M和T进行交互,返回应答
    • Template:模板,生成Html页面

    在这里插入图片描述

3.Django中间件的使用

1.自定义中间件

from django.utils.deprecation import MiddlewareMixin


class Md1(MiddlewareMixin):
    
    def __init__(self):
        pass

    def process_request(self, request):
        print("md1请求")

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("md1 process_view...")

    def process_exception(self, request, exception):
        print("md1 process_exception...")
        
    def process_template(self, request, exception):
        print("md1 process_template...")

    def process_response(self, request, response):
        print("md1 process_response...")
        return response


class Md2(MiddlewareMixin):
    
    def __init__(self):
        pass

    def process_request(self, request):
        print("md2请求")

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("md2 process_view...")

    def process_exception(self, request, exception):
        print("md2 process_exception...")
        
    def process_template(self, request, exception):
        print("md2 process_template...")

    def process_response(self, request, response):
        print("md2 process_response...")
        return response

2.中间件执行顺序

md1请求
md2请求
md1 process_view...
md2 process_view...
md2 process_exception...
md1 process_exception...
md2 process_template...
md1 process_template...
md2 process_response...
md1 process_response...

3.Django3.0中自定义中间件的三种方法

  • 方式一

    def simple_middleware(get_response):
        # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
        def middleware(request):
            # 此处编写的代码会在每个请求处理视图前被调用。
            response = get_response(request)
            # 此处编写的代码会在每个请求处理视图之后被调用。
            return response
        return middleware
    
  • 方式二

    class SimpleMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
            # One-time configuration and initialization.一次性设置和初始化
    
        def __call__(self, request):
            # Code to be executed for each request before
    		# the view (and later middleware) are called.
            # 视图函数执行前的代码
            response = self.get_response(request)
            # Code to be executed for each request/response after
            # the view is called. 视图函数执行后的代码
            return response
    

4.WSGI,uWSGI服务器 和 uwsgi协议

WSGI : Web 服务器网关接口(Web Server Gateway Interface)

uWSGI服务器:Python Web服务器,常见的有gunicorn和uwsgi服务器

uwsgi协议:uWSGI 服务器与应用程序之间的二进制通信协议(属于WSGI)

http协议
uwsgi协议
WSGI协议
客户端
Nginx服务器
uWSGI服务gunicorn,uwsgi
WSGI应用django,flask

参考:

1.Python 之 WSGI、uWSGI 和 uwsgi 介绍

5.nginx和uWISG 服务器之间如何配合工作的

在这里插入图片描述

6.django开发中数据库做过什么优化

表设计:

  1. 设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能;

  2. 能用varchar确定字段长度时,就别用text

  3. 对于搜索频率高的字段属性,在定义时创建索引

  4. 对于存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型

Django框架

  1. Django orm框架下的Querysets 本来就有缓存的
  2. 若页面只需要数据库里某一个两个字段时,可以用QuerySet.values()
  3. 在模板标签里使用with标签可以缓存QuerySet的查询结果
  4. 如果一个页面需要多次连接数据库,最好一次性取出所有需要的数据,减少对数据库的查询次数

7.Python中三大框架各自的应用场景

  • django:大而全,提供了许多的内置方法(ORM,表单),适合中大型项目,如企业级网站,社交网络,电子商务平台等
  • flask:小而灵活,几乎所有的功能都需要扩展,适合快速原型开发,小型项目,微服务等场景
  • Tornado:异步的Web框架,适合构建高性能,实时性要求高的Web应用程序,例如通讯,实时地理位置信息服务,实时分析等场景

8.django如何提升性能(高并发)

前端性能优化

  • 使用雪碧图减少http请求,降低文件大小,提高文件的缓存利用率
  • 使用浏览器缓存,将静态资源缓存到本地浏览器,通过设置http头中的cache-control和expires的属性.可设定浏览器缓存,缓存时间可以自定义
  • 对html,css,javascript文件进行压缩,减少网络的通信量

应用服务器性能优化

  • 合理的使用缓存技术,例如首页做一个缓存,设置一定得过期时间
  • 使用celery.例如发邮件,发短信一些耗时的异步操作交给异步队列执行
  • 配置合适的nginx参数,提升效率

存储服务器优化

  • 读写分离

9. 什么是restful api谈谈你的理解?

REST:表现层状态转换(Representational State Transfer)是一种设计风格

10 什么csrf攻击原理,如何解决

CSRF: 跨站请求伪造(Cross-site request forgery)
在这里插入图片描述

如何解决:

  • 表单中添加 csrf_token 标签

解决方案引发的两种问题

  • 服务端每生成一个 Token,都会存放入 session 中,而随着用户请求的增多,服务端的开销会明显增大
  • 如果网站有多个子域,分别对应不同的服务器,比如 taobao.com 后台是服务器 a,zhibo.baotao.com 后台是服务器b,不同子域要想使用同一个 Token,就要求所有的服务器要能共享这个 Token.一般要有一个中心节点(且应是一个集群)来存储这个Token,这样看下来,架构就变得更加复杂了

如何解决:

  • jwt认证:JSON Web Token,JWT 的诞生并不是解决 CSRF 跨域攻击,而是解决跨域认证的难题

    在这里插入图片描述

pip install pyjwt

应用场景:

  • 当访问量/业务量不是很大时,可以使用 CSRF Token 来防止 CSRF 攻击
  • 相反访问量/业务量对服务器造成很大压力,改用 JWT,建议使用 cookie存储jwt
    • 客户端可以将JWT通过js脚本放入 Header里的Authorization 字段。这么看好像同时存在CSRF 攻击风险和 XSS 攻击风险,实则不然,我们虽然将 JWT存储在 cookie 里,但是我们的服务端并没有利用 cookie 里的 JWT 直接去鉴权,而是通过header里的 Authorization去鉴权,因此这种方法只有 XSS 攻击风险,而没有CSRF 攻击风险

11.Django中的cookie和session

# 设置cookie
response.set_cookie('h1', 'hello django')
# 读取cookie
request.COOKIES.get('my_cookie')

# 读取session
request.session.get('键',默认值)
# 写入session
request.session['键']=# 删除session
del request.session['键']
# 设置过期时间
request.session.set_expiry(value)

request.session.clear()
request.session.flush()

Session,是服务器端保持状态的方案,而Cookie是在客户端保持状态的方案.但是禁用Cookie就不能得到Session,因为Session是用 Session ID 来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用 Cookie 相当于失去了 SessionID,也就得不到 Session

12.简述Django下的(内建的)缓存机制

13.Django HTTP请求的处理流程

在这里插入图片描述

如图所示,

  • 一个 HTTP 请求,首先被转化成一个 HttpRequest 对象,然后该对象被传递给 Request 中间件处理,如果该中间件返回了Response,则直接传递给 Response 中间件做收尾处理
  • 否则的话 Request 中间件将访问 URL 配置,确定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时候,系统会把 request 传递给 view 中间件处理器进行处理
  • 如果该中间件返回了 Response那么该 Response 直接被传递给 Response 中间件进行后续处理
  • 否则将执行确定的 view 函数处理并返回 Response,在这个过程中如果引发了异常并抛出,会被 Exception 中间件处理器进行处理

14.Django重定向你是如何实现的,用的什么状态码

  • 使用HttpResponseRedirect
  • redirect和reverse
  • 状态码:302,301

15.电商网站库存问题

一般团购,秒杀,特价之类的活动,这样会使访问量激增,很多人抢购一个商品,作为活动商品,库存肯定是很有限的

  • 控制库存问题,数据库的事务功能是控制库存超卖的有效方式
  • 将需要秒杀的商品放入缓存中(直接读库写库对数据库压力太大了)
  • 多用户并发修改同一条记录时,可以使用加乐观锁的机制去解决高并发的问题(后提交的用户将覆盖掉前者提交的结果)

16.什么是反向解析

使用场景:模板中的超链接,视图中的重定向

使用步骤:

  • 在定义url时为include定义namespace属性,为url定义name属性
  • 在模板中使用url标签:{% url 'namespace_value:name_value'%}
  • 在视图中使用reverse函数:redirect(reverse('namespce_value:name_value'))

注意:

反向解析传参数,主要是在我们的反向解析的规则后面添加了两个参数,两个参数之间使用空格隔开

<a href="{% url 'booktest:fan2' 2 3 %}">位置参数</a>

17.ORM

Django里QuerySet的get和filter方法的区别

  1. 输入参数
    get 的参数只能是model中定义的那些字段,只支持严格匹配。
    filter的参数可以是字段,也可以是扩展的 where查询关键字,如 in,like 等。
  2. 返回值
    get返回值是一个定义的 model 对象。
    filter返回值是一个新的 QuerySet 对象,然后可以对 QuerySet 再进行查询返回新的 QuerySet 对象,支持链式操作,QuerySet 一个集合对象,可使用迭代或者遍历,切片等,但是不等于 list 类型(使用一定要注意)。
  3. 异常
    get只有一条记录返回的时候才正常,也就说明 get 的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常
    filter 有没有匹配的记录都可以

Django对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做

  • 排序使用order_by()
  • 降序需要在排序字段名前加-
  • 查询字段大于某个值:使用filter(字段名_gt=值)

生成迁移文件和执行迁移文件的命令是什么

python manage.py makemigrations
python manage.py migrate

关系型数据库的关系包括哪些类型?

  • ForeignKey:一对多,将字段定义在多的一端中。
  • ManyToManyField:多对多:将字段定义在两端中。
  • OneToOneField:一对一,将字段定义在任意一端中。

查询集返回列表的过滤器有哪些?(2018-4-16-lxy)

  • all() :返回所有的数据
  • filter():返回满足条件的数据
  • exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
  • order_by():排序

判断查询集中是否有数据

  • exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

18.Restful Api

什么是restful api谈谈你的理解

REST:Representational State Transfer的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。
REST是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计REST风格的网络接口。

REST的特点:
1.具象的。一般指表现层,要表现的对象就是资源。比如,客户端访问服务器,获取的数据就是资源。比如文字、图片、音视频等。
2.表现:资源的表现形式。txt格式、html格式、json格式、jpg格式等。浏览器通过URL确定资源的位置,但是需要在HTTP请求头中,用Accept和Content-Type字段指定,这两个字段是对资源表现的描述。
3.状态转换:客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转换。其中,GET表示获取资源,POST表示新建资源,PUT表示更新资源,DELETE表示删除资源。HTTP协议中最常用的就是这四种操作方式。

RESTful架构:
1.每个URL代表一种资源;
2.客户端和服务器之间,传递这种资源的某种表现层;
3.客户端通过四个http动词,对服务器资源进行操作,实现表现层状态转换

有用过Django REST framework 吗?(2018-4-14-lxy)

Django REST framework 是一个强大而灵活的 Web API 工具.使用 RESTframework 的理由有:

Web browsable API 对开发者有极大的好处

包括 OAuth1a 和 OAuth2 的认证策略

支持 ORM 和非 ORM 数据资源的序列化

全程自定义开发——如果不想使用更加强大的功能,可仅仅使用常规的function-based views

额外的文档和强大的社区支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/431133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.8k star! 用开源免费的edge-tts平替科大讯飞的语音合成服务

edge-tts是github上的一个开源项目&#xff0c;可以免费将文本转为语音&#xff0c;别看它只有2.8k star&#xff0c;替代科大讯飞的收费TTS服务完全没问题&#xff0c;因为这个项目实际是调用的微软edge的在线语音合成服务&#xff0c;支持40多种语言&#xff0c;300多种声音&…

TB-03F-Kit 基础AT指令的使用

文章目录 前言一、使用前准备1. 确保TB-03F-Kit已经连接到电脑&#xff0c;并且已经烧录好固件。2. 准备号调试助手&#xff0c;并且电脑上已经安装好了串口驱动3. 打开串口调试助手并复位模组 二、指令介绍三、基础指令1. 准备测试2. AT 测试指令3. ATHELP 查看指令4. ATRST 模…

我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作&#xff0c;不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成&#xff0c;codebase中并无相对应的代码。举个例子&#xff0c;目前使用的STM的一款eSE&#xff0c;但是这款eSE的开发STM还没有完…

开发知识点-前端-jQuery

jquery $(xxxx) id #<script src"static/js/jquery.min.js?v2.1.4"></script>jQuery对象上面还定义了 Ajax方法&#xff08;$.ajax()&#xff09;&#xff0c;用来处理Ajax操作。调用该方法后&#xff0c;浏览器就会向服务器发出一个HTTP请求。$.ajax…

pytest-教程-14-fixture之yield关键字

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest conftest.py文件的使用方法&#xff0c;本小节我们讲解一下fixture的yield关键字实现teardown后置操作。 当我们运行我们的测试时&#xff0c;我们会希望确保它们自己清理干净&#xf…

冒泡经典题

&#x1f4d1;前言 本文主要是【】——简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#xff1a;狠…

【Redisson分布式锁】Redisson公平锁实现机制

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

python之双端队列deque

普通队列只能进行队尾插入和出队头的操作&#xff0c;双端队列可以对队头和队尾进行操作&#xff0c;而且相比于list实现的队更具有优越性&#xff0c;list实现在删除和插入时的时间复杂度大约为O(n)&#xff0c;而deque的时间复杂度是O(1) 队头操作&#xff1a;append()、pop(…

蓝桥杯练习系统(算法训练)ALGO-986 藏匿的刺客

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 强大的kAc建立了强大的帝国&#xff0c;但人民深受其学霸及23文化的压迫&#xff0c;于是勇敢的鹏决心反抗。   kAc帝国防…

力扣刷题-82.删除排序链表中的重复元素

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1a; 输入&#xff1a;head [1,1,1,2…

计算机组成原理----数据的表示和运算

一&#xff1a;进位计数制 1、进制 B&#xff1a;二进制&#xff1a;0-1 逢二进一、借一当二 O&#xff1a;八进制&#xff1a;0-7 逢八进一 D&#xff1a;十进制&#xff1a;0-9 逢十进一 H&#xff1a;十六进制&#xff1a;0-9、A-F 逢十六进一 r进制2 2、…

第三百八十四回

【toc] 我们在上一章回中介绍了Visibility组件相关的内容&#xff0c;本章回中将介绍Flutter与原生平台通信相关的内容.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 在移动开发领域以Android和IOS SDK开发出的应用程序叫原生开发&#xff0c;开发同一个程序需要…

回溯算法01-组合(Java)

1.组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]示例 2&#xff1a; 输入&#x…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

社交媒体的未来图景:探索Facebook的数字化之旅

社交媒体已经成为现代社会不可或缺的一部分&#xff0c;其影响力已经深入到人们生活的方方面面。而在众多社交媒体平台中&#xff0c;Facebook无疑是其中的巨头&#xff0c;其数字化之旅更是引领着整个社交媒体行业的发展方向。本文将深入探讨社交媒体的未来图景&#xff0c;以…

事务处理

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 事务处理 事务是保证数据完整性的一种手段。 事务具备 ACID 原则&#xff08;包括原子性、一致性、独立性及持久性&#xff09;&#xff0c;保证一个人更新数据的时候&#xff0c;其他…

C# 中 TryParse 将字符串转换为特定类型的方法

在 C# 中&#xff0c;TryParse 是一个用于将字符串转换为特定类型的方法。它用于尝试解析字符串并将其转换为指定类型的值&#xff0c;而不会引发异常。如果解析成功&#xff0c;它将返回 true 并将解析结果存储在输出参数中&#xff1b;如果解析失败&#xff0c;它将返回 fals…

C# 中 Math.Round 数学函数

在 C# 中&#xff0c;Math.Round 是一个数学函数&#xff0c;用于对一个浮点数进行四舍五入操作。它接受一个浮点数作为输入&#xff0c;并返回一个最接近输入值的整数或指定小数位数的浮点数。 Math.Round 方法有多个重载&#xff0c;其中最常用的重载有以下两种形式&#xf…

就业班 2401--3.5 Linux Day11--DNS解析

DNS域名解析服务 少壮不努力&#xff0c;老大徒伤悲。一、 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;…

「项目实践」如何实现导购推荐“千人千面”

前言 在电商背景下&#xff0c;为用户提供精准的导购推荐不仅能极大提升购物体验&#xff0c;也成为推动业务增长的关键驱动力。随着人工智能和数据科学的快速发展&#xff0c;实现“千人千面”的个性化推荐已不再是无法触及的梦想。如何在众多商品中准确捕捉用户的偏好&#…