1. 對Django的認識?css
#1.Django是走大而全的方向,它最出名的是其全自動化的管理後臺:只須要使用起ORM,作簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理後臺。 #2.Django內置的ORM跟框架內的其餘模塊耦合程度高。 #應用程序必須使用Django內置的ORM,不然就不能享受到框架內提供的種種基於其ORM的便利; #理論上能夠切換掉其ORM模塊,但這就至關於要把裝修完畢的房子拆除從新裝修,倒不如一開始就去毛胚房作全新的裝修。 #3.Django的賣點是超高的開發效率,其性能擴展有限;採用Django的項目,在流量達到必定規模後,都須要對其進行重構,才能知足性能的要求。 #4.Django適用的是中小型的網站,或者是做爲大型網站快速實現產品雛形的工具。 #5.Django模板的設計哲學是完全的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數據的可能。html
2. Django 、Flask、Tornado的對比前端
-
#1.Django走的是大而全的方向,開發效率高。它的MTV框架,自帶的ORM,admin後臺管理,自帶的sqlite數據庫和開發測試用的服務器
-
-
#2.Flask是輕量級的框架,自由,靈活,可擴展性很強,核心基於Werkzeug WSGI工具和jinja2模板引擎
-
#3.Tornado走的是少而精的方向,性能優越。它最出名的是異步非阻塞的設計方式
-
-
# 1.iostraem:對非阻塞式的socket進行簡單的封裝
-
# 2.ioloop:對I/O多路複用的封裝,它實現了一個單例
3. 什麼是wsgi,uwsgi,uWSGI?python
-
-
# web服務器網關接口,是一套協議。用於接收用戶請求並將請求進行初次封裝,而後將請求交給web框架
-
-
# 1.wsgiref,本質上就是編寫一個socket服務端,用於接收用戶請求(django)
-
# 2.werkzeug,本質上就是編寫一個socket服務端,用於接收用戶請求(flask)
-
-
# 與WSGI同樣是一種通訊協議,它是uWSGI服務器的獨佔協議,用於定義傳輸信息的類型
-
-
# 是一個web服務器,實現了WSGI協議,uWSGI協議,http協議,
4. django請求的生命週期?ios
-
#1.wsgi,請求封裝後交給web框架 (Flask、Django)
-
#2.中間件,對請求進行校驗或在請求對象中添加其餘相關數據,例如:csrf、request.session -
-
#3.路由匹配 根據瀏覽器發送的不一樣url去匹配不一樣的視圖函數
-
#4.視圖函數,在視圖函數中進行業務邏輯的處理,可能涉及到:orm、templates => 渲染 -
-
-
5. 簡述什麼是FBV和CBV?web
-
-
#基於函數的視圖叫作FBV,基於類的視圖叫作CBV
-
-
#1.提升了代碼的複用性,可使用面嚮對象的技術,好比Mixin(多繼承)
-
#2.能夠用不一樣的函數針對不一樣的HTTP方法處理,而不是經過不少if判斷,提升代碼可讀性
6. 如何給CBV的程序添加裝飾器?ajax
-
-
-
#@method_decorator(test,name='dispatch')
-
-
-
-
-
# def post(self,request,*args,**kwargs):pass
7. 簡述MVC和MTVredis
-
#MVC軟件系統分爲三個基本部分:模型(Model)、視圖(View)和控制器(Controller)
-
#Model:負責業務對象與數據庫的映射(ORM)
-
-
#Control:接受用戶的輸入調用模型和視圖完成用戶的請求
-
#Django框架的MTV設計模式借鑑了MVC框架的思想,三部分爲:Model、Template和View
-
#Model(模型):負責業務對象與數據庫的對象(ORM)
-
#Template(模版):負責如何把頁面展現給用戶
-
#View(視圖):負責業務邏輯,並在適當的時候調用Model和Template
-
-
#它將一個個URL的頁面請求分發給不一樣的view處理,view再調用相應的Model和Template
8. django路由系統中name的做用?sql
-
#用於反向解析路由,至關於給url取個別名,只要這個名字不變,即便對應的url改變
-
9. 列舉django的內置組件?數據庫
-
#1.Admin是對model中對應的數據表進行增刪改查提供的組件
-
-
#3.form組件:1.生成HTML代碼2.數據有效性校驗3校驗信息返回並展現
-
#4.ModelForm組件即用於數據庫操做,也可用於用戶請求的驗證
10. 說一下Django,MIDDLEWARES中間件的做用和應用場景?
-
#中間件是介於request與response處理之間的一道處理過程,用於在全局範圍內改變Django的輸入和輸出。
-
#簡單的來講中間件是幫助咱們在視圖函數執行以前和執行以後均可以作一些額外的操做
-
-
#1.Django項目中默認啓用了csrf保護,每次請求時經過CSRF中間件檢查請求中是否有正確#token值
-
#2.當用戶在頁面上發送請求時,經過自定義的認證中間件,判斷用戶是否已經登錄,未登錄就去登錄。
-
#3.當有用戶請求過來時,判斷用戶是否在白名單或者在黑名單裏
11. 列舉django中間件的5個方法?
-
#1.process_request : 請求進來時,權限認證
-
#2.process_view : 路由匹配以後,可以獲得視圖函數
-
#3.process_exception : 異常時執行
-
#4.process_template_responseprocess : 模板渲染時執行
-
#5.process_response : 請求有響應時執行
12. django的request對象是在何時建立的?
-
#class WSGIHandler(base.BaseHandler):
-
# request = self.request_class(environ)
-
#請求走到WSGIHandler類的時候,執行__cell__方法,將environ封裝成了request
13. Django重定向是如何實現的?用的什麼狀態碼?
-
#1.使用HttpResponseRedirect
-
#from django.http import HttpResponseRedirect
-
-
-
-
#相同點:都表示重定向,瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址
-
-
#301比較經常使用的場景是使用域名跳轉。好比,咱們訪問 http://www.baidu.com 會跳轉到 https://www.baidu.com
-
-
#302用來作臨時跳轉,好比未登錄的用戶訪問用戶中心重定向到登陸頁面。表示舊地址A的資源還在(仍然能夠訪問),這個重定向只是臨時地從舊地址A跳轉到地址B
14. xxss攻擊
-
#-- XSS攻擊是向網頁中注入惡意腳本,用在用戶瀏覽網頁時,在用戶瀏覽器中執行惡意腳本的攻擊。
-
# -- XSS分類,反射型xss ,存儲型xss
-
# -- 反射型xss又稱爲非持久型xss,攻擊者經過電子郵件等方式將包含注入腳本的連接發送給受害者,
-
# 受害者經過點擊連接,執行注入腳本,達到攻擊目的。
-
# -- 持久型xss跟反射型的最大不一樣是攻擊腳本將被永久的存放在目標服務器的數據庫和文件中,多見於論壇
-
# 攻擊腳本連同正常信息一同注入到帖子內容當中,當瀏覽這個被注入惡意腳本的帖子的時候,惡意腳本會被執行
-
# -- 防範措施 1 輸入過濾 2 輸出編碼 3 cookie防盜
-
# 1,輸入過濾 用戶輸入進行檢測 不容許帶有js代碼
-
# 2,輸出編碼 就是把咱們的腳本代碼變成字符串形式輸出出來
-
-
-
-
-
-
-
-
# 2.讀取用戶未公開的資料,若是:郵件列表或者內容、系統的客戶資料,聯繫人列表
-
-
# 1.客戶度端:表單提交以前或者url傳遞以前,對須要的參數進行過濾
-
# 2.服務器端:檢查用戶輸入的內容是否有非法內容
15. django中csrf的實現機制
-
#第一步:django第一次響應來自某個客戶端的請求時,後端隨機產生一個token值,把這個token保存在SESSION狀態中;同時,後端把這個token放到cookie中交給前端頁面;
-
#第二步:下次前端須要發起請求(好比發帖)的時候把這個token值加入到請求數據或者頭信息中,一塊兒傳給後端;Cookies:{csrftoken:xxxxx}
-
#第三步:後端校驗前端請求帶過來的token和SESSION裏的token是否一致;
16. 基於django使用ajax發送post請求時,均可以使用哪一種方法攜帶csrf token?
-
#1.後端將csrftoken傳到前端,發送post請求時攜帶這個值發送
-
-
csrfmiddlewaretoken: '{{ csrf_token }}'
-
-
#2.獲取form中隱藏標籤的csrftoken值,加入到請求數據中傳給後端
-
-
csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
-
-
#3.cookie中存在csrftoken,將csrftoken值放到請求頭中
-
headers:{ "X-CSRFtoken":$.cookie("csrftoken")},
17. Django自己提供了runserver,爲何不能用來部署?(runserver與uWSGI的區別)
-
#1.runserver方法是調試 Django 時常常用到的運行方式,它使用Django自帶的
-
#WSGI Server 運行,主要在測試和開發中使用,而且 runserver 開啓的方式也是單進程 。
-
#2.uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http 等協議。注意uwsgi是一種通訊協議,而uWSGI是實現uwsgi協議和WSGI協議的 Web 服務器。
-
#uWSGI具備超快的性能、低內存佔用和多app管理等優勢,而且搭配着Nginx就是一個生產環境了,可以將用戶訪問請求與應用 app 隔離開,實現真正的部署 。
-
#相比來說,支持的併發量更高,方便管理多進程,發揮多核的優點,提高性能。
18. cookie和session的區別:
-
-
# cookie是保存在瀏覽器端的鍵值對,能夠用來作用戶認證
-
-
# 將用戶的會話信息保存在服務端,key值是隨機產生的自符串,value值時session的內容
-
# 依賴於cookie將每一個用戶的隨機字符串保存到用戶瀏覽器上
-
#Django中session默認保存在數據庫中:django_session表
-
#flask,session默認將加密的數據寫在用戶的cookie中
19. 列舉django orm 中全部的方法(QuerySet對象的全部方法)
-
-
#
<2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象。獲取不到返回None
-
#
<3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個。獲取不到會抱胸
-
#若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
-
#
<4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象
-
#
<5> order_by(*field): 對查詢結果排序
-
#
<6> reverse(): 對查詢結果反向排序
-
#
<8> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。
-
-
-
#
<11> exists(): 若是QuerySet包含數據,就返回True,不然返回False
-
#
<12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的並非一系 model的實例化對象,而是一個可迭代的字典序列
-
#
<13> values_list(*field): 它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列
-
#
<14> distinct(): 從返回結果中剔除重複紀錄
20. only和defer的區別?
-
-
21. select_related和prefetch_related的區別?
-
#有外鍵存在時,能夠很好的減小數據庫請求的次數,提升性能
-
#select_related經過多表join關聯查詢,一次性得到全部數據,只執行一次SQL查詢
-
#prefetch_related分別查詢每一個表,而後根據它們之間的關係進行處理,執行兩次查詢
22. filter和exclude的區別?
#取到的值都是QuerySet對象,filter選擇知足條件的,exclude:排除知足條件的.
23. F和Q的做用?
-
#F:對數據自己的不一樣字段進行操做 如:比較和更新
-
24. values和values_list的區別?
-
-
#values_list : 取元組的queryset
25. 如何使用django orm批量建立數據?
-
-
#objs=[models.Book(title="圖書{}".format(i+15)) for i in range(100)]
-
#models.Book.objects.bulk_create(objs)
26. django的Form和ModeForm的做用?
-
-
-
-
-
-
#ModeForm:根據模型類生成From組件,而且能夠操做數據庫
27. django的Form組件中,若是字段中包含choices參數,請使用兩種方式實現數據源實時更新。
-
-
def def __init__(self, *args, **kwargs):
-
super().__init__(*args, **kwargs)
-
self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")
-
#2.利用ModelChoiceField字段,參數爲queryset對象
28. django的Model中的ForeignKey字段中的on_delete參數有什麼做用?
-
#刪除關聯表中的數據時,當前表與其關聯的field的操做
-
#django2.0以後,表與表之間關聯的時候,必需要寫on_delete參數,不然會報異常
29. django如何實現websocket?
# 列舉django orm中三種能寫sql語句的方法。
-
-
-
-
-
30. django orm 中如何設置讀寫分離?
-
#1.手動讀寫分離:經過.using(db_name)來指定要使用的數據庫
-
-
-
-
# settings.py中指定DATABASE_ROUTERS
-
# DATABASE_ROUTERS = ['myrouter.Router',]
-
#提升讀的性能:多配置幾個數據庫,並在讀取時,隨機選取。寫的時候寫到主庫
-
31. django中如何實現orm表中添加數據時建立一條日誌記錄。
32. django內置的緩存機制?
-
-
-
‘django.middleware.cache.UpdateCacheMiddleware’, #第一
-
'django.middleware.common.CommonMiddleware',
-
‘django.middleware.cache.FetchFromCacheMiddleware’, #最後
-
-
-
-
from django.views.decorators.cache import cache_page
-
-
-
@cache_page(15) #超時時間爲15秒
-
-
-
return render(request,"index.html",locals())
-
-
-
-
<h3 style="color: green">不緩存:-----{{ t }}</h3>
-
-
{% cache 2 'name' %} # 存的key
-
<h3>緩存:-----:{{ t }}</h3>
-
33. django的緩存能使用redis嗎?若是能夠的話,如何配置?
-
#1.安裝 pip install django-redis
-
#2.在stting中配置CACHES,能夠設置多個緩存,根據名字使用
-
-
-
"BACKEND": "django_redis.cache.RedisCache",
-
"LOCATION": "redis://127.0.0.1:6379",
-
-
"CLIENT_CLASS": "django_redis.client.DefaultClient",
-
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
-
-
-
-
-
-
-
-
from django_redis import get_redis_connection
-
conn = get_redis_connection("default")
34. django的模板中filter和simple_tag的區別?
-
# 自定義filter:{{ 參數1|filter函數名:參數2 }}
-
-
-
# simple_tag:{% simple_tag函數名 參數1 參數2 %}
-
-
35. django-debug-toolbar的做用?
-
#1.是django的第三方工具包,給django擴展了調試功能
-
#包括查看sql語句,db查詢次數,request,headers等
36. django中如何實現單元測試?
37. 解釋orm中 db first 和 code first的含義?
-
-
-
#code first基於已存在的模型,生成數據庫庫
38. django中如何根據數據庫表生成model中的類?
-
-
-
#python manage.py inspectdb
-
-
# python manage.py inspectdb > app/models.py
39. 使用orm和原生sql的優缺點?
-
#1.orm的開發速度快,操做簡單。使開發更加對象化
-
#執行速度慢。處理多表聯查等複雜操做時,ORM的語法會變得複雜
-
40. django的contenttype組件的做用?
-
#這個組件保存了項目中全部app和model的對應關係,每當咱們建立了新的model並執行數據庫遷移後,ContentType表中就會自動新增一條記錄
-
#當一張表和多個表FK關聯,而且多個FK中只能選擇其中一個或其中n個時,能夠利用contenttypes
41. 談談你對restful規範的認識?
-
#首先restful是一種軟件架構風格或者說是一種設計風格,並非標準,它只是提供了一組設計#原則和約束條件,主要用於客戶端和服務器交互類的軟件。
-
#就像設計模式同樣,並非必定要遵循這些原則,而是基於這個風格設計的軟件能夠更簡潔,更#有層次,咱們能夠根據開發的實際狀況,作相應的改變。
-
-
#1.restful 提倡面向資源編程,在url接口中儘可能要使用名詞,不要使用動詞
-
#二、在url接口中推薦使用Https協議,讓網絡接口更加安全
-
#https://www.bootcss.com/v1/mycss?page=3
-
#(Https是Http的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,
-
#所以加密的詳細內容就須要SSL(安全套接層協議))
-
-
#https://v1.bootcss.com/mycss
-
#不一樣的版本能夠有不一樣的接口,使其更加簡潔,清晰
-
-
#https://www.bootcss.com/api/mycss
-
-
#https://www.bootcss.com/v1/mycss?page=3
-
#六、能夠根據Http不一樣的method,進行不一樣的資源操做
-
#(5種方法:GET / POST / PUT / DELETE / PATCH)
-
-
-
-
-
#十、返回結果中要提供幫助連接,即API最好作到Hypermedia
-
-
-
-
-
-
-
depart_id:http://www.luffycity.com/api/v1/depart/8/
-
-
42. 接口的冪等性是什麼意思?
-
-
#2.承諾只要調用接口成功,外部屢次調用對系統的影響都是一致的,不會對資源重複操做
43. 什麼是RPC?
-
#遠程過程調用 (RPC) 是一種協議,程序可以使用這種協議向網絡中的另外一臺計算機上的程序請求服務
-
#1.RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。
-
#2.首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。
-
#2.在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,
-
#3.最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。
44. 爲何要使用API
-
-
-
-
45. 爲何要使用django rest framework框架?
-
-
#1.在開發REST API的視圖中,雖然每一個視圖具體操做的數據不一樣,
-
#但增、刪、改、查的實現流程基本同樣,這部分的代碼能夠簡寫
-
#2.在序列化與反序列化時,雖然操做的數據不一樣,可是執行的過程卻類似,這部分的代碼也能夠簡寫
-
#REST framework能夠幫助簡化上述兩部分的代碼編寫,大大提升REST API的開發速度
46. django rest framework框架中都有那些組件?
-
#1.序列化組件:serializers 對queryset序列化以及對請求數據格式校驗
-
-
#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中獲取版本,根據版本不一樣 作不一樣處理
47. django rest framework框架中的視圖均可以繼承哪些類?
-
-
#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下的一些類,封裝了list,create,update等方法
-
48. 簡述 django rest framework框架的認證流程
-
#1.用戶請求走進來後,走APIView,初始化了默認的認證方法
-
#2.走到APIView的dispatch方法,initial方法調用了request.user
-
#3.若是咱們配置了認證類,走咱們本身認證類中的authentication方法
49. django rest framework如何實現的用戶訪問頻率控制
-
#使用IP/用戶帳號做爲鍵,每次的訪問時間戳做爲值,構造一個字典形式的數據,存起來,每次訪問時對時間戳列表的元素進行判斷,
-
#把超時的刪掉,再計算列表剩餘的元素數就能作到頻率限制了
-
#匿名用戶:使用IP控制,可是沒法徹底控制,由於用戶能夠換代理IP登陸用戶:使用帳號控制,可是若是有不少帳號,也沒法限制
50. rest_framework序列化組件的做用,以及一些外鍵關係的鉤子方法
-
-
#1.choices get_字段名_display
-
#2.ForeignKey source=orm 操做
-
#3.ManyToManyFiled SerializerMethodField()
-
-
51. 給用戶提供一個接口以前須要提早作什麼
-
-
52. PV和UV
-
#1.pv:頁面訪問量,沒打開一次頁面PV計算+1,頁面刷新也是
-
53. 什麼是跨域以及解決方法:
-
-
# 瀏覽器從一個域名的網頁去請求另外一個域名的資源時,瀏覽器處於安全的考慮,不容許不一樣源的請求
-
-
-
-
-
-
-
-
-
-
# script標籤不受同源策略的影響,手動建立一個script標籤,傳遞URL,同時傳入一個回調函數的名字
-
# 服務器獲得名字後,返回數據時會用這個函數名來包裹住數據,客戶端獲取到數據以後,當即把script標籤刪掉
-
-
# 使用自定義的HTTP頭部容許瀏覽器和服務器相互通訊
-
-
-
# response['Access-Control-Allow-Origin'] = "*"
-
# 2.若是是複雜請求,首先會發送options請求作預檢,而後再發送真正的PUT/POST....請求
-
# 所以若是複雜請求是PUT等請求,則服務端須要設置容許某請求
-
# 若是複雜請求設置了請求頭,則服務端須要設置容許某請求頭
-
-
-
-
# 兩次請求,在發送數據以前會先發一次請求用於作「預檢」,
-
# 只有「預檢」經過後纔再發送一次請求用於數據傳輸。
-
-
-
# (1) 請求方法是如下三種方法之一:HEAD GET POST
-
-
-
-
-
-
# Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、 text/plain
-
-
# 1.JSONP只能實現GET請求,而CORS支持全部類型的HTTP請求
-
# 2.jsonp須要client和server端的相互配合
-
# 3.cors在client端無需設置,server端須要針對不一樣的請求,來作head頭的處理
54. 如何實現用戶的登錄認證
-
-
-
#3.JWT:json wed token縮寫 它將用戶信息加密到token中,服務器不保存任何用戶信息
-
#服務器經過使用保存的密鑰來驗證token的正確性
55. 如何將dict轉換成url的格式:
-
-
#from urllib.parse import urlencode
-
#post_data={"k1":"v1","k2":"v2"}
-
#ret=urlencode(post_data)
-
#print(ret,type(ret)) #k1=v1&k2=v2
<class 'str'>