Django 的簡單面試題

 1. 對Django的認識?css

#1.Django是走大而全的方向,它最出名的是其全自動化的管理後臺:只須要使用起ORM,作簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理後臺。
#2.Django內置的ORM跟框架內的其餘模塊耦合程度高。
# 應用程序必須使用Django內置的ORM,不然就不能享受到框架內提供的種種基於其ORM的便利;
# 理論上能夠切換掉其ORM模塊,但這就至關於要把裝修完畢的房子拆除從新裝修,倒不如一開始就去毛胚房作全新的裝修。
#3.Django的賣點是超高的開發效率,其性能擴展有限;採用Django的項目,在流量達到必定規模後,都須要對其進行重構,才能知足性能的要求。
#4.Django適用的是中小型的網站,或者是做爲大型網站快速實現產品雛形的工具。
#5.Django模板的設計哲學是完全的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數據的可能。

2. Django 、Flask、Tornado的對比html

#1.Django走的是大而全的方向,開發效率高。它的MTV框架,自帶的ORM,admin後臺管理,自帶的sqlite數據庫和開發測試用的服務器
#給開發者提升了超高的開發效率
#2.Flask是輕量級的框架,自由,靈活,可擴展性很強,核心基於Werkzeug WSGI工具和jinja2模板引擎
#3.Tornado走的是少而精的方向,性能優越。它最出名的是異步非阻塞的設計方式
#Tornado的兩大核心模塊:
#    1.iostraem:對非阻塞式的socket進行簡單的封裝
#    2.ioloop:對I/O多路複用的封裝,它實現了一個單例

3. django請求的生命週期?python

#1.wsgi,請求封裝後交給web框架 (Flask、Django)     
#2.中間件,對請求進行校驗或在請求對象中添加其餘相關數據,例如:csrf、request.session     - 
#3.路由匹配 根據瀏覽器發送的不一樣url去匹配不一樣的視圖函數    
#4.視圖函數,在視圖函數中進行業務邏輯的處理,可能涉及到:orm、templates => 渲染     - 
#5.中間件,對響應的數據進行處理。 
#6.wsgi,將響應的內容發送給瀏覽器。

4.WSGI 和 uWSGI在django中的做用ios

"""
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中間件的做用和應用場景?nginx

#中間件是介於request與response處理之間的一道處理過程,用於在全局範圍內改變Django的輸入和輸出。
#簡單的來講中間件是幫助咱們在視圖函數執行以前和執行以後均可以作一些額外的操做
#例如:
#1.Django項目中默認啓用了csrf保護,每次請求時經過CSRF中間件檢查請求中是否有正確#token值
#2.當用戶在頁面上發送請求時,經過自定義的認證中間件,判斷用戶是否已經登錄,未登錄就去登錄。
#3.當有用戶請求過來時,判斷用戶是否在白名單或者在黑名單裏

6. 列舉django中間件的5個方法?web

#1.process_request : 請求進來時,權限認證
#2.process_view : 路由匹配以後,可以獲得視圖函數
#3.process_exception : 異常時執行
#4.process_template_responseprocess : 模板渲染時執行
#5.process_response : 請求有響應時執行

7. 列舉django orm 中全部的方法(QuerySet對象的全部方法)redis

#<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內置的緩存機制?sql

# 全站緩存
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中的類?django

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接口中儘可能要使用名詞,不要使用動詞             
#二、在url接口中推薦使用Https協議,讓網絡接口更加安全
#https://www.bootcss.com/v1/mycss?page=3
#(Https是Http的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,
#所以加密的詳細內容就須要SSL(安全套接層協議))                          
#三、在url中能夠體現版本號
#https://v1.bootcss.com/mycss
#不一樣的版本能夠有不一樣的接口,使其更加簡潔,清晰             
#四、url中能夠體現是不是API接口 
#https://www.bootcss.com/api/mycss            
#五、url中能夠添加條件去篩選匹配
#https://www.bootcss.com/v1/mycss?page=3             
#六、能夠根據Http不一樣的method,進行不一樣的資源操做
#(5種方法:GET / POST / PUT / DELETE / PATCH)             
#七、響應式應該設置狀態碼
#八、有返回值,並且格式爲統一的json格式             
#九、返回錯誤信息
#返回值攜帶錯誤信息             
#十、返回結果中要提供幫助連接,即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圖

mvc

"""
MVT

Django是一款python的web開發框架
與MVC有所不一樣,屬於MVT框架
m表示model,負責與數據庫交互
v 表示view,是核心,負責接收請求、獲取數據、返回結果
t 表示template,負責呈現內容到瀏覽器







"""

  mvt

"""
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的實現原理

 

cookies和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檢索出來,不然就得 新建一個.)
區別:
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上.

​ 簡單的說,當你登陸一個網站的時候,若是web服務器端使用的是session,那麼全部的數據都保存在服務器上面,客戶端每次請求服務器的時候會發送 當前會話的session_id,服務器根據當前session_id判斷相應的用戶數據標誌,以肯定用戶是否登陸,或具備某種權限。

Session是由應用服務器維持的一個服務器端的存儲空間,用戶在鏈接服務器時,會由服務器生成一個惟一的SessionID,用該SessionID 爲標識符來存取服務器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務器端,來存取Session數據。這一過程,是不用開發人員干預的。因此一旦客戶端禁用Cookie,那麼Session也會失效。

二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。

三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。

四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。(Session對象沒有對存儲的數據量的限制,其中能夠保存更爲複雜的數據類型)


"""
相關文章
相關標籤/搜索