Django 的簡單面試題
阿新 • • 發佈:2018-09-02
無法 src 友好 所有 b2c backend 小強 decorator 硬盤
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. django請求的生命周期?
#1.wsgi,請求封裝後交給web框架 (Flask、Django) #2.中間件,對請求進行校驗或在請求對象中添加其他相關數據,例如:csrf、request.session - #3.路由匹配 根據瀏覽器發送的不同url去匹配不同的視圖函數 #4.視圖函數,在視圖函數中進行業務邏輯的處理,可能涉及到:orm、templates => 渲染 - #5.中間件,對響應的數據進行處理。 #6.wsgi,將響應的內容發送給瀏覽器。
4.WSGI 和 uWSGI在django中的作用
""" WSGI WSGI是一種WEB服務器 ==網關接口==。 是一個Web服務器(如nginx)與應用服務器(如uWSGI)通信的一種規範(協議)。 在生產環境中使用WSGI作為python web的服務器。Python Web服務器網關接口,是Python應用程序或框架和Web服務器之間的一種接口,被廣泛接受。WSGI沒有官方的實現, 因為WSGI更像一個協議,只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行。 uWSGI uWSGI實現了WSGI的所有接口,是一個快速、自我修復、開發人員和系統管理員友好的服務器。uWSGI代碼完全用C編寫,效率高、性能穩定。 uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信。uwsgi協議是一個uWSGI服務器自有的協議,它用於定義傳輸信息的類型。 作用 Django 是一個 Web 框架,框架的作用在於處理 request 和 reponse,其他的不是框架所關心的內容。所以怎麽部署 Django 不是 Django 所需要關心的。 Django 所提供的是一個開發服務器,這個開發服務器,沒有經過安全測試,而且使用的是 Python 自帶的 simple HTTPServer 創建的,在安全性和效率上都是不行的 而uWSGI 是一個全功能的 HTTP 服務器,他要做的就是把 HTTP 協議轉化成語言支持的網絡協議。比如把 HTTP 協議轉化成 WSGI 協議,讓 Python 可以直接使用。 uwsgi 是一種 uWSGI 的內部協議,使用二進制方式和其他應用程序進行通信。 """
5. 說一下Django,MIDDLEWARES中間件的作用和應用場景?
#中間件是介於request與response處理之間的一道處理過程,用於在全局範圍內改變Django的輸入和輸出。 #簡單的來說中間件是幫助我們在視圖函數執行之前和執行之後都可以做一些額外的操作 #例如: #1.Django項目中默認啟用了csrf保護,每次請求時通過CSRF中間件檢查請求中是否有正確#token值 #2.當用戶在頁面上發送請求時,通過自定義的認證中間件,判斷用戶是否已經登陸,未登陸就去登陸。 #3.當有用戶請求過來時,判斷用戶是否在白名單或者在黑名單裏
6. 列舉django中間件的5個方法?
#1.process_request : 請求進來時,權限認證 #2.process_view : 路由匹配之後,能夠得到視圖函數 #3.process_exception : 異常時執行 #4.process_template_responseprocess : 模板渲染時執行 #5.process_response : 請求有響應時執行
7. 列舉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(): 從返回結果中剔除重復紀錄
8. django內置的緩存機制?
# 全站緩存 MIDDLEWARE_CLASSES = ( ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 ‘django.middleware.common.CommonMiddleware‘, ‘django.middleware.cache.FetchFromCacheMiddleware’, #最後 ) # 視圖緩存 from django.views.decorators.cache import cache_page import time @cache_page(15) #超時時間為15秒 def index(request): t=time.time() #獲取當前時間 return render(request,"index.html",locals()) # 模板緩存 {% load cache %} <h3 style="color: green">不緩存:-----{{ t }}</h3> {% cache 2 ‘name‘ %} # 存的key <h3>緩存:-----:{{ t }}</h3> {% endcache %}
9. django的緩存能使用redis嗎?如果可以的話,如何配置?
#1.安裝 pip install django-redis #2.在stting中配置CACHES,可以設置多個緩存,根據名字使用 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密碼", } } }, #另添加緩存 "JERD": { } #3.根據名字去連接池中獲取連接 from django_redis import get_redis_connection conn = get_redis_connection("default")
10. django中如何根據數據庫表生成model中的類?
1.在settings中設置要連接的數據庫 #2.生成model模型文件 #python manage.py inspectdb #3.模型文件導入到models中 # python manage.py inspectdb > app/models.py
11. 使用orm和原生sql的優缺點?
#1.orm的開發速度快,操作簡單。使開發更加對象化 #執行速度慢。處理多表聯查等復雜操作時,ORM的語法會變得復雜 #2.sql開發速度慢,執行速度快。性能強
12. 談談你對restful規範的認識?
#首先restful是一種軟件架構風格或者說是一種設計風格,並不是標準,它只是提供了一組設計#原則和約束條件,主要用於客戶端和服務器交互類的軟件。 #就像設計模式一樣,並不是一定要遵循這些原則,而是基於這個風格設計的軟件可以更簡潔,更#有層次,我們可以根據開發的實際情況,做相應的改變。 #它裏面提到了一些規範,例如: #1.restful 提倡面向資源編程,在url接口中盡量要使用名詞,不要使用動詞 #2、在url接口中推薦使用Https協議,讓網絡接口更加安全 #https://www.bootcss.com/v1/mycss?page=3 #(Https是Http的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL, #因此加密的詳細內容就需要SSL(安全套接層協議)) #3、在url中可以體現版本號 #https://v1.bootcss.com/mycss #不同的版本可以有不同的接口,使其更加簡潔,清晰 #4、url中可以體現是否是API接口 #https://www.bootcss.com/api/mycss #5、url中可以添加條件去篩選匹配 #https://www.bootcss.com/v1/mycss?page=3 #6、可以根據Http不同的method,進行不同的資源操作 #(5種方法:GET / POST / PUT / DELETE / PATCH) #7、響應式應該設置狀態碼 #8、有返回值,而且格式為統一的json格式 #9、返回錯誤信息 #返回值攜帶錯誤信息 #10、返回結果中要提供幫助鏈接,即API最好做到Hypermedia #如果遇到需要跳轉的情況 攜帶調轉接口的URL ret = { code: 1000, data:{ id:1, name:‘小強‘, depart_id:http://www.luffycity.com/api/v1/depart/8/ } }
12. 為什麽要使用django rest framework框架?
#能自動生成符合 RESTful 規範的 API #1.在開發REST API的視圖中,雖然每個視圖具體操作的數據不同, #但增、刪、改、查的實現流程基本一樣,這部分的代碼可以簡寫 #2.在序列化與反序列化時,雖然操作的數據不同,但是執行的過程卻相似,這部分的代碼也可以簡寫 #REST framework可以幫助簡化上述兩部分的代碼編寫,大大提高REST API的開發速度
13. django rest framework框架中都有那些組件?
#1.序列化組件:serializers 對queryset序列化以及對請求數據格式校驗 #2.路由組件routers 進行路由分發 #3.視圖組件ModelViewSet 幫助開發者提供了一些類,並在類中提供了多個方法 #4.認證組件 寫一個類並註冊到認證類(authentication_classes),在類的的authticate方法中編寫認證邏 #5.權限組件 寫一個類並註冊到權限類(permission_classes),在類的的has_permission方法中編寫認證邏輯。 #6.頻率限制 寫一個類並註冊到頻率類(throttle_classes),在類的的allow_request/wait 方法中編寫認證邏輯 #7.解析器 選擇對數據解析的類,在解析器類中註冊(parser_classes) #8.渲染器 定義數據如何渲染到到頁面上,在渲染器類中註冊(renderer_classes) #9.分頁 對獲取到的數據進行分頁處理, pagination_class #10.版本 版本控制用來在不同的客戶端使用不同的行為 #在url中設置version參數,用戶請求時候傳入參數。在request.version中獲取版本,根據版本不同 做不同處理
14. django rest framework框架中的視圖都可以繼承哪些類?
#class View(object): #class APIView(View): 封裝了view,並且重新封裝了request,初始化了各種組件 #class GenericAPIView(views.APIView): #1.增加了一些屬性和方法,如get_queryset,get_serializer #class GenericViewSet(ViewSetMixin, generics.GenericAPIView) #父類ViewSetMixin 重寫了as_view,返回return csrf_exempt(view) #並重新設置請求方式與執行函數的關系 #class ModelViewSet(mixins.CreateModelMixin, # mixins.RetrieveModelMixin, # mixins.UpdateModelMixin, # mixins.DestroyModelMixin, # mixins.ListModelMixin, # GenericViewSet):pass #繼承了mixins下的一些類,封裝了list,create,update等方法 #和GenericViewSet
15. 簡述 django rest framework框架的認證流程
#1.用戶請求走進來後,走APIView,初始化了默認的認證方法 #2.走到APIView的dispatch方法,initial方法調用了request.user #3.如果我們配置了認證類,走我們自己認證類中的authentication方法
16. django rest framework如何實現的用戶訪問頻率控制
#使用IP/用戶賬號作為鍵,每次的訪問時間戳作為值,構造一個字典形式的數據,存起來,每次訪問時對時間戳列表的元素進行判斷, #把超時的刪掉,再計算列表剩余的元素數就能做到頻率限制了 #匿名用戶:使用IP控制,但是無法完全控制,因為用戶可以換代理IP登錄用戶:使用賬號控制,但是如果有很多賬號,也無法限制
17.rest_framework序列化組件的作用,以及一些外鍵關系的鉤子方法
#作用:幫助我們序列化數據 #1.choices get_字段名_display #2.ForeignKey source=orm 操作 #3.ManyToManyFiled SerializerMethodField() # def get_字段名(): # return 自定義
18. PV和UV
#1.pv:頁面訪問量,沒打開一次頁面PV計算+1,頁面刷新也是 #2.UV:獨立訪問數,一臺電腦終端為一個訪客
19. mvc 和mvt的區別
""" MVC 大部分開發語言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模塊之間的耦合性,方便變更,更容易重構代碼,最大程度上實現代碼的重用 m表示model,主要用於對數據庫層的封裝 v表示view,用於向用戶展示結果 c表示controller,是核心,用於處理請求、獲取數據、返回結果 """
MVC圖
""" MVT Django是一款python的web開發框架 與MVC有所不同,屬於MVT框架 m表示model,負責與數據庫交互 v 表示view,是核心,負責接收請求、獲取數據、返回結果 t 表示template,負責呈現內容到瀏覽器 """
""" a,步驟1客戶端請求信息交給視圖函數處理 b,步驟2需要數據的時候調用模型Model,通過步驟3去數據庫拿數據,然後通過步驟4返回給模型Model,再通過步驟5返回給視圖 註:模型Model中不編寫任何sql語句。 在關系數據庫中的一行,相當於模型Model中的一個對象。 在關系數據庫中的一個表,相當於一個對象的集合。在python中用列表定義關系數據庫中的一個表,我們直接在對象中寫列表的操作就可以了,ORM會轉換成sql語句。之後我們得到一個列表對象返回給視圖View c, 視圖View會進行一些處理,比如登陸:需要在數據庫中查詢密碼,查完之後返還給視圖做判斷處理,處理的結果需要用模板Templates呈現(渲染HTML和CSS執行JS),然後返回客戶端。 註意:處理客戶端與服務器之間http請求響應需要實現wsgi協議. wsgi是:PythonWeb服務器網關接口(Python Web Server Gateway Interface,縮寫為WSGI)是Python應用程序或框架和Web服務器之間的一種接口,已經被廣泛接受, 它已基本達成它的可移植性方面的目標。 """
20 .Django中cookie 和session的實現原理
""" HTTP被設計為”無狀態”,每次請求都處於相同的空間中。 在一次請求和下一次請求之間沒有任何狀態保持,我們無法根據請求的任何方面(IP地址,用戶代理等)來識別來自同一人的連續請求。上圖很明顯的展示了Django的session與cookie的實現原理。服務器會生成兩份相同的cookie字符串,一份保存在本地,一份發向請求的瀏覽器。瀏覽器將收到的cookie字符串保存下來,當下次再發請求時,會將信息與這段cookie一同發送到服務器,服務器得到這段cookie會與本地保存的那份判斷是否相同,如果相同就表示用戶已經登錄成功,保存用戶登錄成功的狀態。Django的session保存在數據庫中的數據相當於一個大字典,key為cookie的字符串,value仍是一個字典,字典的key和value為用戶設置的相關信息。這樣就可以方便的存取session裏面的信息。 Cookie概念 ? 在瀏覽某些 網站 時,這些網站會把 一些數據存在 客戶端 , 用於使用網站 等跟蹤用戶,實現用戶自定義 功能. 是否設置過期時間: 如果不設置 過期時間,則表示這個 Cookie生命周期為 瀏覽器會話期間 , 只要關閉瀏覽器,cookie就消失了.這個生命期為瀏覽會話期的cookie,就是會話Cookie; 存儲: 一般保存在 內存,不在硬盤;如果設置了過期時間, 瀏覽器會把cookie保存在硬盤上,關閉再打開瀏覽器, 這些cookie 依然有效直到 超過的設置過期時間;存儲在硬盤上的Cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對於保存 在內存的Cookie,不同的瀏覽器有不同的處理方式。 Session概念 作用:實現網頁之間數據傳遞,是一個存儲在服務器端的對象集合。 原理:當用戶請求一個Asp.net頁面時,系統將自動創建一個Session;退出應用程序或關閉服務器時,該Session撤銷。系統在創建Session時將為其分配一個長長的字符串標識,以實現對Session進行管理與跟蹤。session機制是一種服務器端的機制,服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。 保存:存儲在Server段的內存進程中的,而這個進程相當不穩定,經常會重啟,這樣重啟的話,就會造成Session失效,用戶就必須要重新登錄,用戶體驗相當差,比如用戶在填寫資料,快要結束的時候Session失效,直接跳到登錄頁面; 是否已經創建過session: 當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識(稱為session id),這個 ID 通常是 name為 JSESIONID 的一個 Cookie。 如果已包含則說明以前已經為此客戶端創建過session,服務器就按照session id把這個session檢索出來….使用(檢索不到,會新建一個), 如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id, session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個session id將被在本次響應中返回給客戶端保存。 (總結: 創建一個session時,服務器看這個客戶端 是否包含session標識, 是的話按照session id把session檢索出來,否則就得 新建一個.) 區別: 1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上. ? 簡單的說,當你登錄一個網站的時候,如果web服務器端使用的是session,那麽所有的數據都保存在服務器上面,客戶端每次請求服務器的時候會發送 當前會話的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對象沒有對存儲的數據量的限制,其中可以保存更為復雜的數據類型) """
Django 的簡單面試題