Django基础知识点

1.对Django的认识

  

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

 

2.Django 、Flask、Tornado的对比

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

3.什么是WSGI,uwsgi,uWSGI?

  1.WSGI,web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(描述web server和webapplication的通信规则)

  WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;

  2.uwsgi,与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型

  3.uWSGI, 是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,

4.Django请求的生命周期

  1.WSGI,将请求封装之后交给web框架

  2.中间件,对请求对象进行校验或者添加其他数据比如:csrf

  3.路由匹配,根据不同的url匹配不同的视图函数

  4.视图函数,在视图函数中对请求进行处理(可能涉及到ORM,Template渲染)

  5.中间件,对响应的数据进行处理

  6.WSGI,,将响应的内容发送给浏览器

5.FBV和CBV

  FBV:基于函数的视图

  CBV:基于类的视图

  使用CBV的优点:

    1.提高了代码的复用性,可以使用面向对象的技术,比如(多继承)

    2.可以使用不同的函数对不同的HTTP方法进行处理,而不是使用if...else...判断,提高可读性

6.给CBV程序添加装饰器

  1.引入method_decorator模块

  2.直接在类上添加装饰器

  3.直接在方法上添加装饰器

7.简述MVC和MTV

  MVC软件系统分为三个部分:模型(Model)、视图(View)和控制器(Controller)

    Model:负责业务对象和数据库的映射

    View:负责与用户的交互

    Controller:接受用户的输入调用模型和视图完成用户的请求

  MTV软件系统分为三个部分:模型(Model),模板(Templates),视图(View)

    Model:  负责业务对象和数据库的映射

    Template:负责把页面展示给用户

    View:  负责与用户的交互(需要的时候调用Model和Template)

 

8.Django路由系统中name的作用

  用户反向解析路由,相当于给url起了个别名,只要名字不变,即使路由改变,也能通过此名字找到路由

9.列举Django的内置组件:

  1.Admin是对model中对应的数据表进行增删改查提供的组件

  2.model组件:负责操作数据库

  3.form组件:1.生成HTML代码2.数据有效性校验3校验信息返回并展示

   4.ModelForm组件即用于数据库操作,也可用于用户请求的验证


10.Django中间件的作用和应用场景

  中间件是介于request与response处理之间的一道处理过程,用于在全局范围内改变Django的输入和输出。

  简单的来说中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作

  eg:

    1.Django项目中默认启用了csrf保护,每次请求时通过CSRF中间件检查请求中是否有正确#token值

     2.当用户在页面上发送请求时,通过自定义的认证中间件,判断用户是否已经登陆,未登陆就去登陆。

 

11.Django中间件的几个方法 

 1.process_request : 请求进来时,权限认证
 2.process_view : 路由匹配之后,能够得到视图函数
 3.process_exception : 异常时执行
 4.process_template_responseprocess : 模板渲染时执行
 5.process_response : 请求有响应时执行

 

12.django的request对象是在什么时候创建的( wsgi.py)

  class WSGIHandler(base.BaseHandler):

    request = self.request_class(environ)
  请求走到WSGIHandler类的时候,执行__cell__方法,将environ封装成了request

 13.Django重定向的实现

  1.使用HttpResponseRedirect

  2.使用redirect和reverse

  3.状态码:301和302

      301:常用来做域名跳转(旧资源已经移除,跳转到新资源)

      302:常用来做临时跳转(要访问的资源还在,但是没有条件访问)

 

 

14 csrf实现机制

  第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;

  第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx}

  第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

 

 

15基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?

  以键值对的形式放到要传输的数据data中

 

16.Django本身提供了runserver,为什么不能用来部署?(runserver与uWSGI的区别) 

1.runserver方法是调试 Django 时经常用到的运行方式,它使用Django自带的
WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。
2.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。 uWSGI具有超快的性能、低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署 。 相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

 

17.cookie和session的区别

  1.Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。

  2.Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。

  3.Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。

  4.Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

 

18.django   orm所有方法

  

#<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():            从返回结果中剔除重复纪录

19. F和Q的作用?

  #F:对数据本身的不同字段进行操作 如:比较和更新

  #Q:用于构造复杂的查询条件 如:& |操作

 

20.values和values_list的区别

  #values : 取字典的queryset

  #values_list : 取元组的queryset

 

21.django  Form 和ModeForm的作用

   Form作用:

     1.在前端生成HTML代码
     2.对数据作有效性校验
     3.返回校验信息并展示
 ModeForm:
  根据模型类生成From组件,并且可以操作数据库

22.django缓存能用redis吗?如果可以的话应该如何配置?

  

 1 #1.安装 pip install django-redis
 2 #2.在stting中配置CACHES,可以设置多个缓存,根据名字使用
 3         CACHES = {
 4             "default": {
 5                 "BACKEND": "django_redis.cache.RedisCache",
 6                 "LOCATION": "redis://127.0.0.1:6379",
 7                 "OPTIONS": {
 8                     "CLIENT_CLASS": "django_redis.client.DefaultClient",
 9                     "CONNECTION_POOL_KWARGS": {"max_connections": 100}
10                     # "PASSWORD": "密码",
11                 }
12             }
13         },
14         #另添加缓存
15         "JERD": { }
16 #3.根据名字去连接池中获取连接
17         from django_redis import get_redis_connection
18         conn = get_redis_connection("default")

23.django中如何根据数据库表生成model中的类?

  1.在settings中设置要连接的数据库

  2.生成model模型文件

   python manage.py inspectdb

 3.模型文件导入到models中
   python manage.py inspectdb > app/models.py

24.谈谈你对restful规范的认识?

  #首先restful是一种软件架构风格或者说是一种设计风格,并不是标准,它只是提供了一组设计#原则和约束条件,主要用于客户端和服务器交互类的软件。     

 #就像设计模式一样,并不是一定要遵循这些原则,而是基于这个风格设计的软件可以更简洁,更#有层次,我们可以根据开发的实际情况,做相应的改变。


25.给用户提供一个接口之前需要提前做什么

  1.跟前端进行和交互,确定前端要什么

  2.把需求写个文档保存

 

 

26.PV 和UV

  #1.pv:页面访问量,没打开一次页面PV计算+1,页面刷新也是

  #2.UV:独立访问数,一台电脑终端为一个访客

 

27.如何实现用户的登陆认证

#1.cookie session
#2.token 登陆成功后生成加密字符串
#3.JWT:json wed token缩写 它将用户信息加密到token中,服务器不保存任何用户信息
#服务器通过使用保存的密钥来验证token的正确性

 

 

 

  

 

posted @ 2018-10-07 13:23  Python_Boy  阅读(713)  评论(0编辑  收藏  举报