Django框架面試題
1.基礎部分
1.Django的生命周期是怎樣的過程?
解析:
客戶端發送請求,經由django的wsgi模塊,調用socket創建服務端並發接受客戶端的請求,請求經過正向依次經過中間件中的process_reqeust方法處理。
處理完后,經過Django中的url分發,調用對應的視圖函數,視圖函數根據具體的請求業務邏輯,通過orm模型操作數據庫獲取數據,在通過模板系統渲染html文件,最后返回一個HttpResponse對象。
HttpResponse對象反向依次經過中間件中的process_response方法處理,最終經由wsgi的socket服務端返回給客戶端。
2.寫出你所知道Djang有關的所有命令(下載、安裝等)
1.安裝django pip install django == 1.11.15 2.創建項目 diangoadmin startproject 項目名 3.啟動項目 cd 項目目錄 python manage.py runserver #127.0.0.1:8000 python manage.py runserver 80 python manage.py runserver 0.0.0.0:80 4.創建App python manage.py startapp app01 5.數據庫遷移 python manage.py makemigrations #檢查 models.py是否有變化,記錄變化 app01/migrations python manage.py migrate #將變更記錄同步到數據庫中
3.Django的setting.py中,你用到的配置項有哪些?他們的作用是什么?
1.INSTALLED_APPS # 注冊App 讓Django 程序可以識別新建的App 2.MIDDLEWARE # 中間件 自定義中間件注冊進來可以執行其中的方法 3.TEMPLATES # 模版的相關配置 主要看DIRS 模版的存放路徑 4.DATABASES # 數據庫相關配置 告訴Django連接什么數據庫 5.STATIC_URL='/static/' # 靜態文件的別名, 模版中已別名開頭 6.STATICFILES_DIRS = [ #靜態文件的具體存放路徑,Django會按照該路徑去找靜態文件。 os.path.join(BASE_DIR,'static') ]
4.Django使用Mysql數據庫的流程是什么?
1.創建一個mysql數據庫 2.settings 中寫配置 DATABASES={ 'defalut':{ 'ENGINE':'django.db.backends.mysql', "NAME":'library', "USER":'root', "HOST":'127.0.0.1', "PORT":3306, } }
3.告訴django使用pymysql的模塊連接mysql數據庫 在與settings 同級的目錄下的 __init__.py中寫代碼: import pymysql pymysql.install_as_MySQLdb()
4.在app01/models.py中寫類(繼承models.Model) class Publisher(models.Model): id = models.AutoField(primary_key = True) name = models.CharField(max_length = 32,unique = True)
5.數據庫遷移的命令 python manage.py makemigrations python ,manage.py migrate
5.ORM是什么?為什么要使用ORM?他的優缺點是什么?他的對應關系是什么?
1.ORM(對象關系映射) 是一種為了解決面向對象與關系型數據庫不匹配的技術
2.使用ORM不用在過多得關注SQL語句的編寫,而是更加專注於邏輯代碼的編寫
3.優點:
- ORM 提供了對數據庫的映射,不用直接編寫SQL代碼, 只需操作對象就能對數據庫操作數據
- 讓軟件開發人員專注於業務邏輯的處理,提高了開發效率
缺點:
- ORM 的缺點是會在一定程度上犧牲程序的執行效率
- ORM 的操作是有限的, 也就是ORM定義好的操作是可以完成的
4.對應關系
- 類 ----> 數據表
- 對象-----> 數據行
- 屬性 -----> 字段
6.CBV使用裝飾器的方法有哪些,分別是什么?寫出簡單示例.
1.導入方法裝飾器 from django.utils.decorators import method_decorator 2.方法: # 1.給方法上加裝飾器 @method_decorator(wraper) def get(self,request,*args,**kwargs) return HttpResponse("ok") # 2.給dispatch 上加 @method_decorator(wraper) def dispatch(self,request,*args,**kwargs): # 3.給類上加 @method_decorator(wraper,name = 'get') class Simple(View)
7.cookie 和session 是什么? 為什么要使用它們?
1.cookie 定義: cookie是服務器讓瀏覽器保存在瀏覽器本地的鍵值對 原因: http 是無狀態,每次請求之間沒有任何關系,無法保存狀態. 使用cookie 來保存 一些狀態 2.session 定義: session 是保存在服務器上的鍵值對,依賴於cookie 原因: cookie 在瀏覽器端 不太安全 cookie 長度受限 session長度不受限
8.Django的中間件是什么?請寫出 process_request 和process_response 以及process_view三個方法的執行時間、執行順序和不同返回值不同的流程
1.process_request(self.request) 執行時間 :請求來 先執行,在視圖之前 執行順序: 按照注冊順序執行 返回值: 返回值是None 正常往后走 返回值是 HttpResponse 對象 后面的不在走, 直接執行當前中間的 process_response方法 2.process_response(self,request,response) 執行時間: 視圖函數之后 執行順序:安裝注冊順序倒序執行 返回值: HttpResponse對象 3.process_view(self,request,view_func,view_args,view_kwargs) 執行時間: 在視圖之前 ,process_request之后 執行順序: 按照注冊順序 順序執行 返回值: None 正常往后走 HttpResponse 對象 后面的中間件 process_view方法、視圖不執行 走所有中間的 process_response方法
9.請寫出自定義filter的步驟
1.在app下創建一個名叫 templatetags 的python包 templatetags不能寫錯 2.在templatetags 里建一個 py文件 myfilters 3.在py文件中編輯: from django import template register = template.Library() # register 名字不能錯 @register.filter def add_sb(value,arg): return '{}sb'.format(value) @register.filter(name = 'dsd') def add_sb(value,arg): return '{}sb'.format(value) 4.重啟 5.使用filter {% load myfilters %} {{ name1|dsd:'very' }}
10.Django中操作 cookie 和session 的方法有哪些?
1.cookie 1.設置 cookie rep = redirect("/index/") rep.set_cookie(key,value,max_age = 1000) rep.set_signed_cookie(key,value,max_age = 1000, salt = '') 2.獲取 cookie request.COOKIES['key'] request.COOKIES.get('key') --->推薦的取法 request.get_signed_cookie('key',salt ='') 3.刪除 cookie rep.delete_cookie('key') 2.session 1.設置session request.session['key'] = value request.session.setdefault(key,value) ---->存在就不設置 2.獲取session request.session['key'] request.session.get(key,'') 3.刪除 session request.session.pop(key) ----->刪除某一個鍵值對 del request.session['key'] request.session.delete() -->刪除所有的session 鍵值對 request.session.flush() -->刪除所有的session 鍵值對,刪除了 cookie 4.設置超時時間 request.session.set expiry() 5.清除當前過期的 session request.session.clear_expired()