• 【django】django面试题总结


    一、django中间件的使用

    Django在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下:

    1.初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件

    def __init__(): 
    	pass
    
    • 1
    • 2

    2.处理请求前:在每个请求上调用,返回None或HttpResponse对象。

    def process_request(request): 
    	pass
    
    • 1
    • 2

    3.处理视图前:在每个请求上调用,返回None或HttpResponse对象。

    def process_view(request,view_func,view_args,view_kwargs): 
    	pass
    
    • 1
    • 2

    4.处理模板响应前:在每个请求上调用,返回实现了render方法的响应对象。

    def process_template_response(request,response): 
    	pass
    
    • 1
    • 2

    5.处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。

    def process_response(request,response): 
    	pass
    
    • 1
    • 2

    6.异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象。

    def process_exception(request,exception): 
    	pass
    
    • 1
    • 2

    二、简述Django请求生命周期

    在这里插入图片描述

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

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

    三、对cookies与session的了解?他们能单独用吗?

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

    四、Django中哪里用到了线程?哪里用到了协程?哪里用到了进程?

    1.Django中耗时的任务用一个进程或者线程来执行,比如发邮件,使用celery.

    2.部署django项目是时候,配置文件中设置了进程和协程的相关配置。

    五、谈一下你对uWSGI和nginx的理解?

    1.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。

    要注意WSGI/uwsgi/uWSGI这三个概念的区分。

    WSGI是一种通信协议。

    为什么有了uWSGI为什么还需要nginx?
    因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
    nginx 是一个开源的高性能的HTTP服务器和反向代理:

    1.作为web服务器,它处理静态文件和索引文件效果非常高

    2.它的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间

    3.稳定性高,配置简洁。

    4.强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用

    六、用的restframework完成api发送时间时区

    class getCurrenttime(APIView): 
    	def get(self,request): 
    		local_time = time.localtime() 
    		time_zone =settings.TIME_ZONE 
    		temp = {'localtime':local_time,'timezone':time_zone} 
    		return Response(temp)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    七、Django、Flask、Tornado的对比

    1、 Django走的大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器,给开发者提高了超高的开发效率。 重量级web框架,功能齐全,提供一站式解决的思路,能让开发者不用在选择上花费大量时间。
    自带ORM和模板引擎,支持jinja等非官方模板引擎。

    自带ORM使Django和关系型数据库耦合度高,如果要使用非关系型数据库,需要使用第三方库

    自带数据库管理app

    成熟,稳定,开发效率高,相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发。python web框架的先驱,第三方库丰富

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

    适用于做小网站以及web服务的API,开发大型网站无压力,但架构需要自己设计

    与关系型数据库的结合不弱于Django,而与非关系型数据库的结合远远优于Django

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

    Tornado的两大核心模块:

    iostraem:对非阻塞的socket进行简单的封装

    ioloop: 对I/O 多路复用的封装,它实现一个单例

  • 相关阅读:
    docker搭建私有仓库并推送本地镜像
    k8s之HPA
    java计算机毕业设计基于springboot 在线动漫交流平台
    【NLP】第 4 章:文本预处理、词干提取和词形还原
    redis高可用(主从复制,哨兵,集群)
    docker pull速度慢解决办法
    信创服务器、中间件、数据库监控方案设计与实现
    程序设计思路-球连球组成的群
    量变引起质变:安卓改多了,就是自己的OS
    了解.NET Framework中自带的泛型委托Predicate和Comparison
  • 原文地址:https://blog.csdn.net/YZL40514131/article/details/125250634