Python web框架总结——Django

1、长连接和短连接

首先介绍下短链接和长连接的区别:

短连接

连接->传输数据->关闭连接
比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。

长连接

连接->传输数据->保持连接 -> 传输数据-> ...........->直到一方关闭连接,多是客户端关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,
这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都
不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果
用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网
站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成
千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频
繁操作情况下需用短连好。

2、常见的返回状态码

状态码响应类别原因短语
1XX信息性状态码(Informational)服务器正在处理请求
2XX成功状态码(Success)请求已正常处理完毕
3XX重定向状态码(Redirection)需要进行额外操作以完成请求
4XX客户端错误状态码(Client Error)客户端原因导致服务器无法处理请求
5XX服务器错误状态码(Server Error)服务器原因导致处理请求出错
    • 200 OK 
      请求正常处理完毕
    • 204 No Content 
      请求成功处理,没有实体的主体返回
    • 206 Partial Content 
      GET范围请求已成功处理
    • 301 Moved Permanently 
      永久重定向,资源已永久分配新URI
    • 302 Found 
      临时重定向,资源已临时分配新URI
    • 303 See Other 
      临时重定向,期望使用GET定向获取
    • 304 Not Modified 
      发送的附带条件请求未满足
    • 307 Temporary Redirect 
      临时重定向,POST不会变成GET
    • 400 Bad Request 
      请求报文语法错误或参数错误
    • 401 Unauthorized 
      需要通过HTTP认证,或认证失败
    • 403 Forbidden 
      请求资源被拒绝
    • 404 Not Found 
      无法找到请求资源(服务器无理由拒绝)
    • 500 Internal Server Error 
      服务器故障或Web应用故障
    • 503 Service Unavailable 
      服务器超负载或停机维护

3 请解释或描述一下Django的架构

对于Django框架遵循MVC设计,并且有一个专有的名词:MVT

M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架

V全拼为View,与MVC中的C功能相同,接收HttpRequest,业务处理,返回HttpReponse

T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html,内嵌了模板引擎

4 简述MVC模式和MVT模式

    所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求

MTV
    Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:

  1. M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)
  2. T 代表模板 (Template):负责如何把页面展示给用户(html)
  3. V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template
    除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

 一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。


5 ORM

ORM(对象关系映射)的作用是在关系型数据库和业务实体对象之间做一个映射,这样开发者在操作数据库的数据时,就不需要再去和复杂的SQL语句打交道,只需要简单地操作对象的属性和方法。在MVC/MVT设计模式中的Model模块中都包括ORM

python语法 - 自动翻译 - > SQL语句

ORM优势

(1)只需要面向对象编程, 不需要面向数据库编写代码.

    对数据库的操作都转化成对类属性和方法的操作.
    不用编写各种数据库的sql语句.

(2)实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.

    不在关注用的是mysql、oracle...等.
    通过简单的配置就可以轻松更换数据库, 而不需要修改代码.

ORM劣势

    相比较直接使用SQL语句操作数据库,有性能损失.
    根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.

ORM必须具备的3方面基本能力

映射技术:将数据库的类型映射为编程语言自身的类型;将数据表定义映射为编程语言自身的类;将数据库中基于外键的关系连接转换为编程语言中基于对象引用的关系连接。

CURD操作:做数据库处理时的增加、读取、更新和删除操作

缓存优化:将数据库中查询到的数据以类对象的形式保存在内存中,以便之后再用时随时提取;将真正需要读取查询结果时才执行数据库的select操作,而不是在ORM查询命令执行时查询数据库

ORM和数据库关系:

在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表.

基本情况:

每个模型都是一个Python类,它是django.db.models.Model的子类。

模型的每个属性都代表一个数据库字段。

综上所述,Django为您提供了一个自动生成的数据库访问API。

ORM的对应关系:
        类--->数据表
        对象--->数据行
        属性--->字段

ORM能做的事儿:
        1.操作数据表 - >创建表/删除表/修改表
            操作models.py里面的类
        2。操作数据行 - >数据的增加改查
            
注意:ORM不能创建数据库,需要自己动手创建数据库!
        
使用Django的ORM详细步骤:
        1。自己动手创建数据库
            创建数据库数据库名;(终端或可视化工具里)
        2.在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库)
            #数据库相关的配置(setting.py(与项目同名文件夹内))

    DATABASES = {
                    'default': {
                        'ENGINE': 'django.db.backends.mysql',  # 连接的数据库类型
                        'HOST': '127.0.0.1',  # 连接数据库的地址
                        'PORT': 3306,  # 端口
                        'NAME': "day61",  # 数据库名称
                        'USER': 'root',  # 用户
                        'PASSWORD': '123456'  # 密码
                    }
                }
        3.告诉Django用pymysql代替默认的MySQLDB连接MySQL数据库
            在项目下app目录的__init__.py文件中,写下面两句:

                    import pymysql
                    # 告诉Django用pymysql来代替默认的MySQLdb
                    pymysql.install_as_MySQLdb()#(MySQLdb不支持中py3)

        4.在app下面的models.py文件中定义一个类,这个类必须继承models.Model

                class 类名(models.Model):
                    ...

            示例:

    from django.db import model
    # Create your models here.
    #ORM(数据库相关操作)相关的只能写在这个文件里,卸载文件里Django不识别
    # OPM对应关系:类对应数据表,对象对应数据行,属性对应字段
    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True) # 创建自增的一个主键
        name = models.CharField(null=False, max_length=20) #varchar且不能为空的字段

         5.终端内(项目文件夹下)执行两个命令,ORM自动按照对应关系创建数据表

    1. python3 manage.py makemigrations #记录models.py中改动内容
    2. python3 manage.py migrate        #吧改动翻译成SQL语句

ORM的具体操作见:https://blog.csdn.net/qq_34493908/article/details/81352784?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

6.你对Django的认识?

Django是走大而全的方向,它最出名的是全自动化的管理后台;只需要使用ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。

Django内置的ORM跟框架内的其他模块耦合程度高

应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利。理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛坯房做全新的装修。

Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能的要求。

Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。

Django模板的设计哲学是彻底的将代码、样式分离; Django从根本上杜绝在模板中进行编码、处理数据的可能。

Django的主要特点:

  • 完善的文档
  • 集成数据访问组件:Django的Modle层自带数据库ORM组件,使开发者无须学习其他数据库访问技术
  • 强大的url映射技术:Django使用正则表达式管理URL映射,因此给开发者带来了极高的灵活性
  • 后台管理系统自动生成:开发者只需要简单的几行配置和代码就可以实现完整的后台数据管理web控制台
  • 错误信息非常完整

7.Django 本身提供了 runserver,为什么不能用来部署?

runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。性能较差。

runserver 是作为开发时候用的,不适合用于生产环节
1 静态文件: runserver 服务器当 debug=True 的时候 才会开启静态文件服务器。
2 性能: runserver 应该是单线程的。性能差,如果出现错误挂掉。那么整个进程都挂掉了。用 Nginx apache 的话 应该是只有香港的进程才会挂掉

 uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具有超快的性能、低内存占用和多 app 管理等优点,并且搭配着 Nginx

就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署 。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

django web框架(即应用服务器)

nginx  web服务器

8. Django 、Flask、Tornado的对比

#1.Django走的是大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器,给开发者提高了超高的开发效率

#2.Flask是轻量级的框架,自由,灵活,可扩展性很强,核心基于Werkzeug WSGI工具和jinja2模板引擎

#3.Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式

#Tornado的两大核心模块:

# 1.iostraem:对非阻塞式的socket进行简单的封装 2.ioloop:对I/O多路复用的封装,它实现了一个单例

9. 什么是wsgi,uwsgi,uWSGI?

#WSGI:
#    web服务器网关接口,是一套协议。介于web服务器和应用服务器之间
。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架
#    实现wsgi协议的模块:
#        1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)
#        2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)
#uwsgi:
#    与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型
#uWSGI:
#    是一个web服务器,实现了WSGI协议,uWSGI协议,http协议

10. django请求的生命周期?

#1.wsgi,请求封装后交给web框架 (Flask、Django)     
#2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session     -
#3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数    
#4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染     -
#5.中间件,对响应的数据进行处理。
#6.wsgi,将响应的内容发送给浏览器。

11、简述MVC和MTV

#MVC软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)
#Model:负责业务对象与数据库的映射(ORM)
#View:负责与用户的交互
#Control:接受用户的输入调用模型和视图完成用户的请求
#Django框架的MTV设计模式借鉴了MVC框架的思想,三部分为:Model、Template和View
#Model(模型):负责业务对象与数据库的对象(ORM)
#Template(模版):负责如何把页面展示给用户
#View(视图):负责业务逻辑,并在适当的时候调用Model和Template
#此外,Django还有一个urls分发器,
#它将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

12、列举django的内置组件?

#1.Admin是对model中对应的数据表进行增删改查提供的组件
#2.model组件:负责操作数据库
#3.form组件:1.生成HTML代码2.数据有效性校验3校验信息返回并展示
#4.ModelForm组件即用于数据库操作,也可用于用户请求的验证

13. Django重定向是如何实现的?用的什么状态码?

#1.使用HttpResponseRedirect
#from django.http import HttpResponseRedirect  
#2.使用redirect和reverse
#状态码:301和302
#301和302的区别:
#相同点:都表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址
#不同点:
#301比较常用的场景是使用域名跳转。比如,我们访问 http://www.baidu.com 会跳转到 https://www.baidu.com
#表示旧地址A的资源已经被永久地移除了
#302用来做临时跳转,比如未登陆的用户访问用户中心重定向到登录页面。表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B

14、django中csrf的实现机制

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

18. cookie和session的区别:

#1.cookie:
#    cookie是保存在浏览器端的键值对,可以用来做用户认证
#2.session:
#   将用户的会话信息保存在服务端,key值是随机产生的自符串,value值时session的内容
#    依赖于cookie将每个用户的随机字符串保存到用户浏览器上
#Django中session默认保存在数据库中:django_session表
#flask,session默认将加密的数据写在用户的cookie中

19. 列举django orm 中所有的方法(QuerySet对象的所有方法)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值