黑马程序员技术交流社区

标题: 【西安校区】python面试基础知识(三) Django部分 [打印本页]

作者: 逆风TO    时间: 2019-11-19 16:09
标题: 【西安校区】python面试基础知识(三) Django部分
1、Django请求的生命周期
a. wsgi, 创建socket服务端,用于接收用户请求并对请求进行初次封装。
b. 中间件,对所有请求到来之前,响应之前定制一些操作。
c. 路由匹配,在url和视图函数对应关系中,根据当前请求url找到相应的函数。
d. 执行视图函数,业务处理【通过ORM去数据库中获取数据,再去拿到模板,然后将数据和模板进行渲染】
e. 再经过所有中间件。
f. 通过wsgi将响应返回给用户。

2、简述django对http请求的执行流程。
一个 HTTP 请求,首先被转化成一个 HttpRequest 对象,然后该对象被传递给        
Request 中间件处理,如果该中间件返回了Response,则直接传递给
Response 中间件做收尾处理。否则的话 Request 中间件将访问 URL 配置,确
定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时
候,系统会把 request 传递给 View 中间件处理器进行处理,如果该中间件返回
了Response,那么该Response 直接被传递给 Response 中间件进行后续处
理,否则将执行确定的 View 函数处理并返回 Response,在这个过程中如果引
发了异常并抛出,会被 Exception 中间件处理器进行处理。
3、简述Django的orm
ORM,全拼Object-Relation Mapping,意为对象-关系映射
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面
向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项
目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据
库引擎即可

4、Django里QuerySet的get和filter方法的区别?
django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。
django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。

get
只能取出一条数据,如果满足条件的数据有多条,抛出异常
没有数据,也会抛出异常

filter
如果有数据,就返回QuerySet(类似于可以遍历的数组) 如果没有数据,返回empty(不会抛异常)

5、简述Django下的(内建的)缓存机制。
缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去
执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.django提
供了6中内存缓存机制,分别为:

开发调试缓存(为开发调试使用,实际上不使用任何操作);
内存缓存(将缓存内容缓存到内存中);
文件缓存(将缓存内容写到文件 );
数据库缓存(将缓存内容存到数据库);
memcache缓存(包含两种模块,python-memcached或pylibmc.)。
以上缓存均提供了三种粒度的应用。

6、django中model的slugfeild类型字段有什么用途?
只包含字母、数字、下划线和连接符,通常用于urls
1
7、Python中@staticmethod和@classmethod的区别。
在类中总共有三种方法:普通方法(需要参数,使用时默认将类的实例对象传进去,类调用的时候需要
传递实例对象),@staticmethod装饰的静态方法与普通函数相同(实例和类均可调用,没有默认的参
数传递进去),@classmethod装饰的类方法(需要参数,使用时将调用的类传进去,或者实例对象调
用时是将实例对应的类传进去。
8、什么是socket?
socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为
几个简单的接口供应用层调用以实现进程在网络中通信。
9、Web开发中,session和cookie的作用与区别。
Cookie概念
在浏览某些 网站 时,这些网站会把 一些数据存在 客户端 , 用于使用网站 等跟踪用户实现用户自定
义 功能.
是否设置过期时间:
如果不设置 过期时间,则表示这个 Cookie生命周期为 浏览器会话期间 , 只要关闭浏览器,cookie就消失了.
这个生命期为浏览会话期的cookie,就是会话Cookie;
    存储:    一般保存在 内存,不在硬盘;
    如果设置了过期时间, 浏览器会把cookie保存在硬盘上,关闭再打开浏览器, 这些cookie 依然有效直到 超
过的设置过期时间;
          Session的概念
        作用:实现网页之间数据传递,是一个存储在服务器端的对象集合。
        原理:当用户请求一个Asp.net页面时,系统将自动创建一个Session;退出应用程序或关闭服务器
        时,该Session撤销。系统在创建Session时将为其分配一个长长的字符串标识,以实现对Session进
        行管理与跟踪。

     cookie 和session 的区别:  
    1、cookie数据存放在客户的浏览器上,session数据放在服务器上.
           简单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存
           在服务器上面,

    客户端每次请求服务器的时候会发送 当前会话的session_id,服务器根据当前session_id判断相应的用
    户数据标志,以确定用户是否登录,或具有某种权限。

    由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的session_id,用
    特殊的浏览器伪造该用户的请求也是能够成功的。

    session_id是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请
    求,也不是没有重复的可能性,我曾经就遇到过一次。

    登录某个网站,开始显示的 是自己的信息,等一段时间超时了,一刷新,居然显示了别人的信息。
    Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个
    唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据
    则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取
    Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失
    效。
    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用
    session。
    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务
    器性能方面,应当使用COOKIE。
    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对
    象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
10、Web开发中有哪些技术手段防止SQL注入?
1.使用预编译绑定变量的SQL语句
2.严格加密处理用户的机密信息
3.不要随意开启生产环境中Webserver的错误显示
4.使用正则表达式过滤传入的参数
5.字符串过滤
6.检查是否包函非法字符

11、如何查看占用8080端口的是什么进程?
windows查看端口占用
在windows命令行窗口下执行:
netstat -aon|findstr "8080"
linux系统
先使用 netstat命令,再用 ps命令
执行命令: netstat -anp|grep 8080
输出结果: tcp 0 0 :::8080 :::* LISTEN 12006/java
执行命令: ps -ef | grep 12006

12、谈谈Django中的中间件。
django.middleware.security.SecurityMiddleware’
一些安全设置,比如XSS脚本过滤。
django.contrib.sessions.middleware.SessionMiddleware
session支持中间件,加入这个中间件,会在数据库中生成一个django_session的表。
django.middleware.common.CommonMiddleware
通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。比如/blog/111会处理
成/blog/111/自动加上反斜杠
django.middleware.csrf.CsrfViewMiddleware
跨域请求伪造中间件。加入这个中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一
个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击
django.contrib.auth.middleware.AuthenticationMiddleware
用户授权中间件。他会在每个HttpRequest对象到达view之前添加当前登录用户的user属性,也就是你可
以在view中通过request访问user
django.contrib.messages.middleware.MessageMiddleware
消息中间件。展示一些后台信息给前端页面。如果需要用到消息,还需要在INSTALLED_APPS中添加
django.contrib.message才能有效。如果不需要,可以把这两个都删除
django.middleware.clickjacking.XFrameOptionsMiddleware
防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。

13、谈谈CSRF原理
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/
sessionriding,缩写为:CSRF/XSRF。
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情
包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包
括:个人隐私泄露以及财产安全。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
  1.登录受信任网站A,并在本地生成Cookie。
  2.在不登出A的情况下,访问危险网站B。

14、谈谈RESTful规范
Representational State Transfer "表现层状态转化"
restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。
restful: 给用户一个url,根据method不同在后端做不同的处理,比如:post 创建数据、get获取数据、put
和patch修改数据、delete删除数据。
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
我们常用的状态码:
200   请求成功
301   永久重定向
302   临时重定向   
403   权限问题
404   找不到页面
500   服务器问题

15、Django中FBV与CBV
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views) 就是在视图里使用类处理请求。
如果我们要写一个处理GET方法的view,用函数写的话是下面这样。
from django.http import HttpResponse
def my_view(request):
     if request.method == 'GET':
            return HttpResponse('OK')
如果用class-based view写的话,就是下面这样
from django.http import HttpResponse
from django.views import View
class MyView(View):
      def get(self, request):
            return HttpResponse('OK')
Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view提
供了一个as_view()静态方法(也就是类方法),
在url中,就这么写:
# urls.py
from django.conf.urls import url
from myapp.views import MyView

urlpatterns = [
     url(r'^index/$', MyView.as_view()),
]

16、谈谈Django REST freamwork
自动生成符合 RESTful 规范的 API
支持 OPTION、HEAD、POST、GET、PATCH、PUT、DELETE
根据 Content-Type 来动态的返回数据类型(如 text、json)
Django Rest framework 的流程大概是这样的
1.建立 Models
2.依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器
显示)
3.ViewSet 是一个 views 的集合,根据客户端的请求(GET、POST等),返回 Serialiers 处理的数据
权限 Premissions 也在这一步做处理
4.ViewSet 可在 Routers 进行注册,注册后会显示在 Api Root 页上
5.在 urls 里注册 ViewSet 生成的 view,指定监听的 url

17、对Django的认识?
#1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象
定义,它就能自动生成数据库结构、以及全功能的管理后台。
#2.Django内置的ORM跟框架内的其他模块耦合程度高。
#应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;
#理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛
胚房做全新的装修。
#3.Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都
需要对其进行重构,才能满足性能的要求。
#4.Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。
#5.Django模板的设计哲学是彻底的将代码、样式分离; Django从根本上杜绝在模板中进行编码、处理数
据的可能。

18、Django 、Flask、Tornado的对比
#1.Django走的是大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据
库和开发测试用的服务器
#给开发者提高了超高的开发效率
#2.Flask是轻量级的框架,自由,灵活,可扩展性很强,核心基于Werkzeug WSGI工具和jinja2模板引擎
#3.Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式
#Tornado的两大核心模块:
#    1.iostraem:对非阻塞式的socket进行简单的封装
#    2.ioloop:对I/O多路复用的封装,它实现了一个单例

19、什么是wsgi,uwsgi,uWSGI?
#WSGI:
#    web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架
#    实现wsgi协议的模块:
#        1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)
#        2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)
#uwsgi:
#    与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型
#uWSGI:
#    是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,
20、django请求的生命周期?
#1.wsgi,请求封装后交给web框架 (Flask、Django)     
#2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session     -
#3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数   
#4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染     -
#5.中间件,对响应的数据进行处理。
#6.wsgi,将响应的内容发送给浏览器。

21、简述什么是FBV和CBV?
#FBV和CBV本质是一样的
#基于函数的视图叫做FBV,基于类的视图叫做CBV
#在python中使用CBV的优点:
#1.提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
#2.可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

22、如何给CBV的程序添加装饰器?
#引入method_decorator模块
#1.直接在类上加装饰器
#@method_decorator(test,name='dispatch')
#class Loginview(View):
#    pass
#2.直接在处理的函数前加装饰器
#@method_decorator(test)
#    def post(self,request,*args,**kwargs):pass







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2