Django、Python常見面試題


一、django
       1、中間件

            中間件一般做認證或批量請求處理,django中的中間件,其實是一個類,在請求和結束后,django會根據自己的規則在合適的時機執行中間件中相應的方法,
                  如請求過來 執行process_request, view,process_response方法

      2、Django、Tornado、Flask各自的優勢

           Django:Django無socket,django的目的是簡便,快速開發,並遵循MVC設計,多個組件可以很方便的以“插件”形式服務於整個框架,
                           django有許多功能強大的第三方插件。django具有很強的可擴展性。
           Tornado:它是非阻塞式服務器,而且速度相當快,得力於其 非阻塞的方式和對epoll的運用,Future對象,缺點:沒有session,需要自定制
           Flask:是一個微型的web框架,配合SQLALchemy來使用,jinja2模板, werkzeug接口                  
       
       3、 django版本,Python版本,linux版本

                       django:1.11
                Python:3.5
                linux:6.8
       4、django的template的注釋是什么樣子的

             單行:{#注釋#}
             多行注釋:{%comment%}
        
       5、django怎么弄並發的

             nginx+uwsig為django提供高並發,nginx的並發能力超過,單台並發能力過完,在純靜態的web服務中更是突出其優越的地方,由於底層使用epoll異步IO模型進行處理。
    
      6、tornodo的ioloop知道是什么嗎?

           事件循環
              
      7、select_related和prefetch_related,Q和F

             select_related:一對多使用,查詢主動做連表
             prefetch_related:多對多或者一對多的時候使用,不做連表,做多次查詢
             Q:用於構造復雜查詢條件
             F:更新時用於獲取原來的值,專門取對象中某一列進行操作

      8、什么是ORM?

            ORM,即Object-Relational Mapping(對象關系映射),它的作用是在關系型數據庫和業務實體對象之間做一個映射
            ORM優缺點:
                優點:擺脫復雜的SQL操作,適應快速開發,讓數據結果變得簡單,數據庫遷移成本更低
                缺點:性能較差,不適用於大型應用,復雜的SQL操作還需要通過SQL語句實現

      9、CORS跨域資源共享

             首先會發送"預檢"opption",請求,如果"預檢"成功,則發送真實數據。
       
     10、Django的Form主要具有以下功能?

             生成HTMl標簽,驗證用戶數據 is_vaild,HTML Form提交保留上次提交數據,初始化頁面顯示內容

     11、CBV和FBV

             CBV在指定的類上面加上裝飾器或在此方法上面添加裝飾器 @method_decorator,並繼承view
           
     12、cookie及session

              cookie:是保留在客戶端上面的一組鍵值對,cookie不是很安全,別人可以分析存放在本地的cookie
              session:是保存在服務器上面的一組鍵值對,依賴與cookie,安全指數比cookie高
        
      13、django的請求生命周期

                請求來了先到uwsgi,把請求做一部分分裝給django框架,然后經過所有的中間件,路由,視圖,視圖處理再返回給中間件,中間件在返回給uwsgi,在返回給用戶。
    
      14、uwsgi和wsgi

         wsgi:是web服務器網關接口,是pyhton應用程序或框架和web服務器之間的一種接口,其廣泛使用的是django框架。
         uwsgi:是一個web服務器,它實現了wsgi協議,Nginx中HttpUwsgiModule的作用是與Uwsgi服務器進行交換

  15、解釋下django - debug -toolbar的使用

                使用django開發站點時,可以使用django-debug-toolbar來進行調試,在settings.py中添加 'debug—toolbar.midleware.Debug ToolbarMiddleware'到項目的MIDDLEWARE_CLASSES內。


                
二、Python部分
        1、 __new__.__init__區別,如何實現單例模式,有什么優點

            __new__是一個靜態方法,__init__是一個實例方法
            __new__返回一個創建的實例,__init__什么都不返回
            __new__返回一個cls的實例時后面的__init__才能被調用
            當創建一個新實例時調用__new__,初始化一個實例時調用__init__

        2、深淺拷貝

            淺拷貝只是增加了一個指針指向一個存在的地址,而深拷貝是增加一個指針並且開辟了新的內存,這個增加的指針指向這個新的內存,
            采用淺拷貝的情況,釋放內存,會釋放同一內存,深拷貝就不會出現釋放同一內存的錯誤

        3、HTTP/IP相關協議,分別位於哪層

              http協議是超文本傳輸協議,http協議是基於TCP/IP通信協議來傳遞數據
              http協議工作與c/s架構上,瀏覽器作為http的客戶端通過URL向http服務端即web服務器發送所用請求。web服務器收到所有請求后,向客戶端發送響應信息,
              http特點是短連接,無狀態
                
                地址欄鍵輸入URL,按下回車之后經歷了什么?
                1.瀏覽器向DNS服務器請求解析該URL中的域名所對應的IP地址
                2.解析出IP地址后,根據IP地址和默認端口80,和服務器建立TCP連接
                3.瀏覽器發出讀取文件的http請求,該請求報文作為TCP三次握手的第三個報文的數據發送給服務器
                4.服務器對瀏覽器請求做出響應,並把對應的html文件發送給瀏覽器
                5.釋放TCP連接
                6.瀏覽器將該HMTL渲染並顯示內容

        4、TCP/UDP區別

               TCP協議是面向連接,保證高可靠性(數據無丟失,數據無失序,數據無錯誤,數據無重復達到)傳輸層協議
               UDP:數據丟失,無秩序的傳輸層協議(qq基於udp協議)

        5、webscoket

              websocket是基於http協議的,可持續化連接
               輪詢:瀏覽器每隔幾秒就發送一次請求,詢問服務器是否有新消息
               長輪詢:客戶端發起連接后,如果沒有消息,就一直不返回response給客戶端,直到有消息返回,返回完之后,客戶端再次發起連接

        6、RabbitMQ:

              服務器端有Erlang語言來編寫,支持多種客戶端,只會ajax,用於分布式系統中存儲轉發消息,在易用性、擴展性、高可用性的方面不俗。
              connection是RabbitMQ的socket連接,它封裝了socket部分相關協議邏輯
              connectionFactroy為connection的制造工廠
              channel是我們與RabbitMQ打交道的最重要的一個接口,大部分的業務操作是在chaanel這個接口中完成,包括定義Queue、定義Exchange、
               綁定Queue與Exchange,發布消息等

        7、裝飾器

             調用裝飾器其實是一個閉包函數,為其他函數添加附加功能,不修改被修改的源代碼和不修改被修飾的方式,裝飾器的返回值也是一個函數對象。
             比如:插入日志、性能測試、事物處理、緩存、權限驗證等,有了裝飾器,就可以抽離出大量與函數功能本身無關的雷同代碼並繼續重用。
            
        8、閉包

           1.必須有一個內嵌函數
           2.內嵌函數必須引用外部函數的變量(該函數包含對外作用域而不是全局作用域名字的引用)
           3.外部函數的返回值必須是內嵌函數

        9、迭代器與生成器

             迭代可迭代對象對應_iter_(方法)和迭代器對應_next_(方法)的一個過程
             生成器:包括含有yield這個關鍵字,生成器也是迭代器,調動next把函數變成迭代器。

        10、classmethod,staticmethod,property

                 類方法:將類的函數轉換成類方法,函數上裝飾@classmethod會將函數的自動傳值參數改成cls
                 靜態方法:此方法相當於給類擴展一個功能,將類內的函數實例化,給類或對象使用,此時類內的函數就是普通函數,不管是類還是實例化的對象都可以使用
                 實例化:類的實例化就會產生一個實例(對象),可以理解為類()把虛擬的東西實例化,得到具體存在的值
    
        11、常用的狀態碼           

                200--服務器成功返回網頁
                204--請求收到,但返回信息為空
                304--客戶端已經執行了GET,但文件未變化
                400--錯誤請求,如語法錯誤
                403--無權限訪問
                404--請求的頁面不存在
                500--服務器產生內部錯誤

        12、多進程,多線程,協程,GIL

                GIL:全局解釋器鎖,是鎖在cpython解釋器上,導致同一時刻,同一進程只能有一個線程被執行
                多進程:多進程模塊multiprocessing來實現,cpu密集型,IO計算型可以用多進程
                多線程:多線程模塊threading來實現,IO密集型,多線程可以提高效率
                協程:依賴於geenlet,對於多線程應用。cpu通過切片的方式來切換線程間的執行,遇到IO操作自動切換,線程切換時需要耗時,
                                         而協成好處沒有切換的消耗,沒有鎖定概念。
                進程:是資源管理單位,進行是相互獨立的,實現並發和並發
                線程:是最小的執行單位,線程的出現為了降低上下文切換的消耗,提供系統的並發性

        13、IO多路復用/異步非阻塞

                 IO多路復用:通過一種機制,可以監聽多個描述符 select/poll/epoll
                 select:連接數受限,查找配對速度慢,數據由內核拷貝到用戶態
                 poll:改善了連接數,但是還是查找配對速度慢,數據由內核拷貝到用戶態
                 epoll:epoll是linux下多路復用IO接口,是select/poll的增強版,它能顯著提高程序在大量並發連接中只有少量活躍的情況下的系統CPU利用率
                異步非阻塞:異步體現在回調上,回調就是有消息返回時告知一聲兒進程進行處理。非阻塞就是不等待,不需要進程等待下去,
                                      繼續執行其他操作,不管其他進程的狀態。

        14、PEP8規范,規范的好處是什么?

                1.縮進:4個空實現縮進,盡量不使用Tab
                2.行:沒行最大長度不超過79,換行可以使用反斜杠
                3.命名規范:
                4.注釋規范:

        15、range-and-xrange

               都在循環時使用,xrange內存性能更好,xrange用法與range完全相同,range一個生成list對象,xrange是生成器

        16、with上下文機制原理

                 _enter_和_exit_,上下文管理協議,即with語句,為了讓一個對象兼容with語句,必須在這個對象類中聲明_enter_和_exit_方法,
                 使用with語句的目的就是把代碼塊放入with中執行,with結束后,自動完成清理工作,無須收到干預

        17、經典類、新式類

                經典類遵循:深度優先,python2中
                新式類遵循:廣度優先,Python3中

         18、有沒有一個工具可以幫助查找Python的bug和進行靜態的代碼分析?

                 PyChecker是一個Python代碼的靜態分析工具,它可以幫助查找Python代碼的bug,會對代碼的復雜度和格式提出警告,
                        Pylint是另外一個工具可以進行codingstandard檢查  
          
          19、 Python是如何進行內存管理的

                   1.對象引用計數:
                        引用計數增加的情況:
                             來保持追蹤內存中的對象,所有對象都用引用計數,一個對象分配一個新名稱
                             將其放入一個容器中(列表,字典,元祖)
                         引用計數減少的情況:
                              使用del語句對對象別名顯示的銷毀
                              引用超出作用域或被重新賦值
                              sys.getrefcount()函數可以獲得對象的當前引用計數
                     2.標記-清除機制
                        

                     3.分代技術

          20、什么是python?使用python有什么好處?

                  python是一種編程語言,它有對象、模塊、線程、異常處理和自動內存管理。它簡潔,簡單、方便、容易擴展、有許多自帶的數據結果,而且它開源
        
          21、什么是pickling和unpickling?

                 Pickle模塊讀入任何python對象,將它們轉換成字符串,然后使用dump函數將其轉儲到一個文件中——這個過程叫做pickling
                 反之從存儲的字符串文件中提取原始python對象的過程,叫做unpickling

          22、python是如何被解釋的?

                 Python是一種解釋性語言,它的源代碼可以直接運行,Python解釋器會將源代碼轉換成中間語言,之后再翻譯成機器碼再執行
    
          23、數組和元祖之間的區別是什么?

                 數組和元祖之間的區別:數組內容可以被修改,而元祖內容是只讀的,不可被修改的,另外元祖可以被哈希,比如作為字典的key

          24、參數按值傳遞和引用傳遞是怎么實現的?

                 python中的一切都是類,所有的變量都是一個對象的引用。引用的值是由函數確定的,因此無法被改變,但是如果一個對象是可以被修改的,你可以改動對象

          25、Python都有哪些自帶的數據結構?

                 Python自帶的數據結構分為可變和不可變的:可變的有:數組、集合、字典,不可變的是:字符串、元祖、整數

          26、什么是python的命名空間?

                 在python中,所有的名字都存在於一個空間中,它們在改空間中存在和被操作——這就是命名空間,它就好像一個盒子,在每個變量名字都對應裝着一個對象,
                          當查詢變量的時候,會從該盒子里面尋找相應的對象

          27、python中的unittest是什么?

                 在python中,unittest是python中的單元測試框架,它擁有支持共享搭建、自動測試、在測試中暫停代碼、將不同測試迭代成一組

          28、*args與**kwargs

                 *args代表位置參數,它會接收任意多個參數並把這些參數作為元祖傳遞給函數。**kwargs代表的關鍵字參數,返回的是字典,位置參數一定要放在關鍵字前面
    
          29、在Python中什么是slicing?

                 slicing是一種在有序的對象類型中(數組、元祖、字符串)節選某一段的語法
            
          30、中的docstring是什么?

                Python中文檔字符串被稱為docstring,它在Python中的作用是為函數、模塊和類注釋生成文檔

          31、os與sys區別:

                  os是模塊負責程序與操作系統的交互,提供了訪問操作系統底層的接口
                  sys模塊是負責程序與python解釋器的交互,提供了一系列的函數和變量,用於操控Python時運行的環境
          32、實現一個單例模式

                            _new_()在 _init_()之前被調用,用於生成實例對象。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。
                   單例模式是指創建唯一對象,單例模式設計的類只能實例,實例化1個對象
                   class Singleton(object):
                        __instance=None
                        def __init__(self):
                            pass
                        def __new__(cls, *args, **kwargs):
                            if Singleton.__instance is None:
                                Singleton.__instance=object.__new__(cls,*args,**kwargs)
                            return Singleton.__instance

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM