bd5.2 Django
1.Django 創建項目的命令?
django-admin startproject 項目名稱 python manage.py startapp 應 用 app 名 ?2.Django創建項目后,項目文件夾下的組成部分(對 mvt? 的理解)??
項目文件夾下的組成部分: manage.py 是項目運行的入口,指定配置文件路徑。與項目同名的目錄,包含項目的配置文件。init.py 是一個空文件,作用是這個目錄可以被當作包使用,也可以做一些初始化操作。 settings.py 是項目的整體配置文件。 urls.py 是項目的 URL 配置文件。 wsgi.py 是項目與 WSGI 兼容的 Web 服務器。3.對 MVC,MVT 解讀的理解?
M:Model,模型,和數據庫進行交互
V:View,視圖,負責產生 Html 頁面
C:Controller,控制器,接收請求,進行處理,與 M 和 V 進行交互,返回應答。
1、 用戶點擊注按鈕,將要注冊的信息發送給網站服務器。 2、 Controller 控制器接收到用戶的注冊信息,Controller 會告訴 Model 層將用戶的注冊信息保存到數據庫 3、 Model 層將用戶的注冊信息保存到數據庫 4、 數據保存之后將保存的結果返回給 Model 模型, 5、 Model 層將保存的結果返回給 Controller 控制器。 6、 Controller 控制器收到保存的結果之后,或告訴 View 視圖,view 視圖產生一個 html 頁面。 7、 View 將產生的 Html 頁面的內容給了 Controller 控制器。 8、 Controller 將 Html 頁面的內容返回給瀏覽器。 9、 瀏覽器接受到服務器 Controller 返回的Html 頁面進行解析展示。?
M:Model,模型,和 MVC 中的 M 功能相同,和數據庫進行交互。
V:view,視圖,和 MVC 中的 C 功能相同,接收請求,進行處理,與 M 和 T 進行交互,返回應答。
T:Template,模板,和 MVC 中的 V 功能相同,產生 Html 頁面
1、 用戶點擊注冊按鈕,將要注冊的內容發送給網站的服務器。 2、 View 視圖,接收到用戶發來的注冊數據,View 告訴 Model 將用戶的注冊信息保存進數據庫。 3、 Model 層將用戶的注冊信息保存到數據庫中。 4、 數據庫將保存的結果返回給 Model 5、 Model 將保存的結果給 View 視圖。 6、 View 視圖告訴 Template 模板去產生一個 Html 頁面。 7、 Template 生成 html 內容返回給 View 視圖。 8、 View 將html 頁面內容返回給瀏覽器。 9、 瀏覽器拿到 view 返回的 html 頁面內容進行解析,展示。4.Django中 models 利用 ORM 對 Mysql 進行查表的語句(多個語句)?
字段查詢all():返回模型類對應表格中的所有數據。get():返回表格中滿足條件的一條數據,如果查到多條數據,則拋異常:MultipleObjectsReturned,查詢不到數據,則拋異常:DoesNotExist。filter():參數寫查詢條件,返回滿足條件 QuerySet 集合數據。條件格式:**模型類屬性名**_條件名=值注意:此處是模型類屬性名,不是表中的字段名。關于 filter 具體案例如下:
? 判等 exact。
? 1. BookInfo.object.filter(id=1)
? 2. BookInfo.object.filter(id__exact=1)此處的__exact 可以省略?
??
? 模糊查詢 like
? 例:查詢書名包含'傳'的圖書。contains
? 1. contains BookInfo.objects.filter(btitle__contains='傳')
? 空查詢 where 字段名 isnull
? 1. BookInfo.objects.filter(btitle__isnull=False)
? 范圍查詢 where id in (1,3,5)
? 1. BookInfo.objects.filter(id__in=[1,3,5])
? 比較查詢 gt lt(less than) gte(equal) lte
? BookInfo.objects.filter(id__gte=3)
? 日期查詢
? 1. BookInfo.objects.filter(bpub_date__year = 1980)
? 2. BookInfo.objects.filter(bpub_date__gt = date(1980,1,1))
? exclude:返回不滿足條件的數據。
? 3. BookInfo.objects.exclude(id=3)
?
? F 對象
? 作用:用于類屬性之間的比較條件。
? 1. from django.db.models import F
? 2. 例:where bread > bcomment BookInfo.objects.filter(bread__gt =F('bcomment'))
? 3. 例:BookInfo.objects.filter(bread__gt=F('bcomment')*2)
? Q 對象
? 作用:用于查詢時的邏輯條件。可以對 Q 對象進行&|~操作。
? 1. from django.db.models import Q
? 2. BookInfo.objects.filter(id__gt=3, bread__gt=30)
? 3. BookInfo.objects.filter(Q(id__gt=3) & Q(bread__gt=3))
? 4. 例:BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))
? 5. 例:BookInfo.objects.filter(~Q(id=3))
? order_by 返回 QuerySet
? 作用:對查詢結果進行排序。
? 1. 例: BookInfo.objects.all().order_by('id')
? 2. 例: BookInfo.objects.all().order_by('-id')
? 3. 例:BookInfo.objects.filter(id__gt=3).order_by('-bread')
?
? 聚合函數
? ? 作用:對查詢結果進行聚合操作。
? 1. sum count max min avg
? aggregate:調用這個函數來使用聚合。
1. from django.db.models import Sum,Count,Max,Min,Avg
? ?2. 例:BookInfo.objects.aggregate(Count('id'))
? {'id__count': 5} 注意返回值類型及鍵名
? 1. 例:BookInfo.objects.aggregate(Sum('bread'))
? {'bread__sum':120} 注意返回值類型及鍵名
?
? count 函數
? 作用:統計滿足條件數據的數目。
? 例:統計所有圖書的數目。
? 1. BookInfo.objects.all().count()
? 例:統計 id 大于 3 的所有圖書的數目。
? 1. BookInfo.objects.filter(id__gt = 3).count()
?
? 模型類關系
? ? ?一對多關系
? 例:圖書類-英雄類
? models.ForeignKey() 定義在多的類中。
? 2)多對多關系
? 例:新聞類-新聞類型類
? models.ManyToManyField() 定義在哪個類中都可以。
? 3)一對一關系
? 例:員工基本信息類-員工詳細信息類
? models.OneToOneField() 定義在哪個類中都可以。
5.django 中間件的使用?
Django 在中間件中預置了六個方法,這六個方法的區別在于不同的階段執行,對輸入或輸出進行干 預,方法如下: 1.初始化:無需任何參數,服務器響應第一個請求的時候調用一次,用于確定是否啟用當前中間件。1.def __init__():2. pass 2.處理請求前:在每個請求上調用,返回 None 或 HttpResponse 對象。1.def process_request(request):2. pass 3.處理視圖前:在每個請求上調用,返回 None 或 HttpResponse 對象。1.def process_view(request, view_func, view_args, view_kwargs):2. pass 4.處理模板響應前:在每個請求上調用,返回實現了 render 方法的響應對象。1.def process_template_response(request, response):2. pass 5.處理響應后:所有響應返回瀏覽器之前被調用,在每個請求上調用,返回 HttpResponse 對象。1.def process_response(request, response):2. pass 6.異常處理:當視圖拋出異常時調用,在每個請求上調用,返回一個 HttpResponse 對象。1.def process_exception(request,exception):2. pass6.談一下你對 uWSGI 和 nginx 的理解?
1. uWSGI 是一個 Web 服務器,它實現了 WSGI 協議、uwsgi、http 等協議。Nginx 中 HttpUwsgiModule 的作用是與 uWSGI 服務器進行交換。
WSGI 是一種 Web 服務器網關接口。它是一個 Web 服務器(如 nginx,uWSGI 等服務器)與 web 應用(如用 Flask 框架寫的程序)通信的一種規范。
要注意 WSGI / uwsgi / uWSGI 這三個概念的區分。WSGI 是一種通信協議。uwsgi 是一種線路協議而不是通信協議,在此常用于在 uWSGI 服務器與其他網絡服務器的數據通信。uWSGI 是實現了 uwsgi 和 WSGI 兩種協議的 Web 服務器。
2. nginx 是一個開源的高性能的 HTTP 服務器和反向代理:1.作為 web 服務器,它處理靜態文件和索引文件效果非常高;2.它的設計非常注重效率,最大支持 5 萬個并發連接,但只占用很少的內存空間;3.穩定性高,配置簡潔;4.強大的反向代理和負載均衡功能,平衡集群中各個服務器的負載壓力應用。
7.說說 nginx 和 uWISG 服務器之間如何配合工作的?
首先瀏覽器發起 http 請求到 nginx 服務器,Nginx 根據接收到請求包,進行 url 分析,判斷訪問的資源類型,如果是靜態資源,直接讀取靜態資源返回給瀏覽器,如果請求的是動態資源就轉交給 uwsgi服務器,uwsgi 服務器根據自身的 uwsgi 和 WSGI 協議,找到對應的 Django 框架,Django 框架下的應用進行邏輯處理后,
將返回值發送到 uwsgi 服務器,然后 uwsgi 服務器再返回給 nginx,最后 nginx將返回值返回給瀏覽器進行渲染顯示給用戶。 如果可以,畫圖講解效果更佳。
?
8. django 開發中數據庫做過什么優化?
1.設計表時,盡量少使用外鍵,因為外鍵約束會影響插入和刪除性能; 2.使用緩存,減少對數據庫的訪問; 3.在 orm 框架下設置表時,能用 varchar 確定字段長度時,就別用 text; 4.可以給搜索頻率高的字段屬性,在定義時創建索引; 5.Django orm 框架下的 Querysets 本來就有緩存的; 6.如果一個頁面需要多次連接數據庫,最好一次性取出所有需要的數據,減少對數據庫的查詢次數; 7.若頁面只需要數據庫里某一個兩個字段時,可以用 QuerySet.values(); 8.在模板標簽里使用 with 標簽可以緩存 Qset 的查詢結果。9.驗證碼過期時間怎么設置??
將驗證碼保存到數據庫或 session,設置過期時間為 1 分鐘,然后頁面設置一個倒計時(一般是前端js 實現 這個計時)的展示,一分鐘過后再次點擊獲取新的信息。
10.Python 中三大框架各自的應用場景?
django:主要是用來搞快速開發的,他的亮點就是快速開發,節約成本,正常的并發量不過 10000, 如果要實現高并發的話,就要對 django 進行二次開發,比如把整個笨重的框架給拆掉,自己寫 socket 實現 http 的通信,底層用純 c,c++寫提升效率,ORM 框架給干掉,自己編寫封裝與數據庫交互的框 架,因為啥呢,ORM 雖然面向對象來操作數據庫,但是它的效率很低,使用外鍵來聯系表與表之間的查詢;
flask:
輕量級,主要是用來寫接口的一個框架,實現前后端分離,提升開發效率,Flask 本身相當于一個內核,
其他幾乎所有的功能都要用到擴展(郵件擴展 Flask-Mail,用戶認證 Flask-Login),都需要用第三方的擴展來實現。
比如可以用 Flask-extension 加入 ORM、窗體驗證工具,文件上傳、身份驗證等。
Flask 沒有默認使用的數據庫,你可以選擇 MySQL,也可以用 NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模塊),模板引擎則使用 Jinja2。這兩個也是 Flask 框架的核心。
Python 最出名的框架要數 Django,此外還有 Flask、Tornado 等框架。雖然 Flask 不是最出名的框架,
但是 Flask 應該算是最靈活的框架之一,這也是 Flask 受到廣大開發者喜愛的原因。
Tornado:
Tornado 是一種 Web 服務器軟件的開源版本。Tornado 和現在的主流 Web 服務器框 架(包括大多數 Python 的框架)有著明顯的區別:它是非阻塞式服務器,而且速度相當快。 得利于其非阻塞的方式和對 epoll 的運用,Tornado 每秒可以處理數以千計的連接,因此 Tornado 是實時 Web 服務的一個 理想框架。
11. django 如何提升性能(高并發)?
對一個后端開發程序員來說,提升性能指標主要有兩個一個是并發數,另一個是響應時間網站性能的優化一般包括 web 前端性能優化,應用服務器性能優化,存儲服務器優化。 對前端的優化主要有:1.減少 http 請求,減少數據庫的訪問量,比如使用雪碧圖。2.使用瀏覽器緩存,將一些常用的 css,js,logo 圖標,這些靜態資源緩存到本地瀏覽器,通過設置 http 頭中的 cache-control 和 expires 的屬性,可設定瀏覽器緩存,緩存時間可以自定義。3 對 html,css,javascript 文件進行壓縮,減少網絡的通信量。對我個人而言,我做的優化主要是以下三個方面:1.合理的使用緩存技術,對一些常用到的動態數據,比如首頁做一個緩存,或者某些常用的數據做個緩存,設置一定得過期時間,這樣減少了對數據庫的壓力,提升網站性能。2.使用 celery 消息隊列,將耗時的操作扔到隊列里,讓 worker 去監聽隊列里的任務,實現異步操作,比如發郵件,發短信。3.就是代碼上的一些優化,補充:nginx 部署項目也是項目優化,可以配置合適的配置參數,提升效率,增加并發量。4.如果太多考慮安全因素,服務器磁盤用固態硬盤讀寫,遠遠大于機械硬盤,這個技術現在沒有普及,主要是固態硬盤技術上還不是完全成熟, 相信以后會大量普及。5.另外還可以搭建服務器集群,將并發訪問請求,分散到多臺服務器上處理。6.最后就是運維工作人員的一些性能優化技術了。
12.什么是 restful api,談談你的理解?
REST:Representational State Transfer 的縮寫,翻譯:“具象狀態傳輸”。一般解釋為“表現層狀態轉換”。 REST 是設計風格而不是標準。是指客戶端和服務器的交互形式。我們需要關注的重點是如何設計REST 風格的網絡接口。 REST 的特點:1.具象的。一般指表現層,要表現的對象就是資源。比如,客戶端訪問服務器,獲取的數據就是資源。比如文字、圖片、音視頻等。2.表現:資源的表現形式。txt 格式、html 格式、json 格式、jpg 格式等。瀏覽器通過 URL 確定資源的位置,但是需要在 HTTP 請求頭中,用 Accept 和 Content-Type 字段指定,這兩個字段是對資源表現的描述。3.狀態轉換:客戶端和服務器交互的過程。在這個過程中,一定會有數據和狀態的轉化,這種轉化叫做狀態轉換。
其中,GET 表示獲取資源,POST 表示新建資源,PUT 表示更新資源,DELETE 表示刪除資源。HTTP 協議中最常用的就是這四種操作方式。 RESTful 架構:1.每個 URL 代表一種資源;2.客戶端和服務器之間,傳遞這種資源的某種表現層;3.客戶端通過四個 http 動詞,對服務器資源進行操作,實現表現層狀態轉換。
12.1 如何設計符合 RESTful 風格的 API 一、域名:將 api 部署在專用域名下: http://api.example.com或者將 api 放在主域名下: http://www.example.com/api/ 二、版本:將 API 的版本號放在 url 中。http://www.example.com/app/1.0/infohttp://www.example.com/app/1.2/info 三、路徑:路徑表示 API 的具體網址。每個網址代表一種資源。資源作為網址,網址中不能有動詞只能有名詞,一般名詞要與數據庫的表名對應。而且名詞要使用復數。錯誤示例:http://www.example.com/getGoodshttp://www.example.com/listOrders 正確示例:#獲取單個商品 http://www.example.com/app/goods/1#獲取所有商品http://www.example.com/app/goods 四、使用標準的 HTTP 方法:對于資源的具體操作類型,由 HTTP 動詞表示。 常用的 HTTP 動詞有四個。GET SELECT :從服務器獲取資源。POST CREATE :在服務器新建資源。PUT UPDATE :在服務器更新資源。DELETE DELETE :從服務器刪除資源。示例:#獲取指定商品的信息GET http://www.example.com/goods/ID#新建商品的信息POST http://www.example.com/goods#更新指定商品的信息PUT http://www.example.com/goods/ID#刪除指定商品的信息DELETE http://www.example.com/goods/ID 五、過濾信息:如果資源數據較多,服務器不能將所有數據一次全部返回給客戶端。API 應該提供參數,過濾返回結果。
實例:#指定返回數據的數量http://www.example.com/goods?limit=10#指定返回數據的開始位置http://www.example.com/goods?offset=10#指定第幾頁,以及每頁數據的數量http://www.example.com/goods?page=2&per_page=20 六、狀態碼:服務器向用戶返回的狀態碼和提示信息,常用的有:200 OK :服務器成功返回用戶請求的數據201 CREATED :用戶新建或修改數據成功。202 Accepted:表示請求已進入后臺排隊。400 INVALID REQUEST :用戶發出的請求有錯誤。401 Unauthorized :用戶沒有權限。403 Forbidden :訪問被禁止。404 NOT FOUND :請求針對的是不存在的記錄。406 Not Acceptable :用戶請求的的格式不正確。500 INTERNAL SERVER ERROR :服務器發生錯誤。 七、錯誤信息:一般來說,服務器返回的錯誤信息,以鍵值對的形式返回。{error: 'Invalid API KEY'} 八、響應結果:針對不同結果,服務器向客戶端返回的結果應符合以下規范。#返回商品列表GET http://www.example.com/goods#返回單個商品GET http://www.example.com/goods/cup#返回新生成的商品POST http://www.example.com/goods#返回一個空文檔DELETE http://www.example.com/goods 九、使用鏈接關聯相關的資源:在返回響應結果時提供鏈接其他 API 的方法,使客戶端很方便的獲取相關聯的信息。 十、其他: 服務器返回的數據格式,應該盡量使用 JSON,避免使用 XML。
13.什么 csrf 攻擊原理?如何解決?
簡單來說就是: 你訪問了信任網站 A,然后 A 會用保存你的個人信息并返回給你的瀏覽器一個cookie,然后呢,在 cookie 的過期時間之內,你去訪問了惡意網站 B,它給你返回一些惡意請求代碼,要求你去訪問網站 A,
而你的瀏覽器在收到這個惡意請求之后,在你不知情的情況下,會帶上保存在本地瀏覽器的 cookie 信息去訪問網站 A,
然后網站 A 誤以為是用戶本身的操作,導致來自惡意網站 C 的攻擊代碼會被執:發郵件,發消息,修改你的密碼,購物,轉賬,偷窺你的個人信息,導致私人信息泄漏和賬戶財產安全收到威脅
14.啟動 Django 服務的方法?
runserver 方法是調試 Django 時經常用到的運行方式,它使用 Django 自帶的 WSGI Server 運行,主要在測試和開發中使用,并且 runserver 開啟的方式也是單進程 。
15.怎樣測試 django 框架中的代碼?
在單元測試方面,Django 繼承 python 的 unittest.TestCase 實現了自己的django.test.TestCase,編寫測試用例通常從這里開始。測試代碼通常位于 app 的 tests.py 文件中(也可以在 models.py 中編寫,一般不建議)。在 Django 生成的 depotapp 中,已經包含了這個文件,并且其中包含了一個測試 用例的樣例: 1. python manage.py test:執行所有的測試用例 2. python manage.py test app_name, 執行該 app 的所有測試用例 3. python manage.py test app_name.case_name: 執行指定的測試用例 一些測試工具:unittest 或者 pytest
https://www.jb51.net/article/82238.htm 16. 有過部署經驗?用的什么技術?可以滿足多少壓力? 1.有部署經驗,在阿里云服務器上部署的2.技術有:nginx + uwsgi 的方式來部署 Django 項目3.無標準答案(例:壓力測試一兩千)
17. Django 中哪里用到了線程?哪里用到了協程?哪里用到了進程? 1.Django 中耗時的任務用一個進程或者線程來執行,比如發郵件,使用 celery。2.部署 django 項目的時候,配置文件中設置了進程和協程的相關配置。
18.django 關閉瀏覽器,怎樣清除 cookies 和 session?
設置 Cookie1. def cookie_set(request):2. response = HttpResponse("<h1>設置 Cookie,請查看響應報文頭</h1>")3. response.set_cookie('h1', 'hello django')4. return response 讀取 Cookie1. def cookie_get(request):2. response = HttpResponse("讀取 Cookie,數據如下:<br>")3. if request.COOKIES.has_key('h1'):4. response.write('<h1>' + request.COOKIES['h1'] + '</h1>')5. return response以鍵值對的格式寫會話。1. request.session['鍵']=值 根據鍵讀取值。1. request.session.get('鍵',默認值) 清除所有會話,在存儲中刪除值部分。1. request.session.clear() 清除會話數據,在存儲中刪除會話的整條數據。1. request.session.flush() 刪除會話中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。1. del request.session['鍵'] 設置會話的超時時間,如果沒有指定過期時間則兩個星期后過期。如果 value 是一個整數,會話將在 value 秒沒有活動后過期。如果 value 為 0,那么用戶會話的 Cookie 將在用戶的瀏覽器關閉時過期。如果 value 為 None,那么會話在兩周后過期。1. request.session.set_expiry(value)
Session 依賴于 Cookie,如果瀏覽器不能保存 cookie 那么 session 就失效了。因為它需要瀏覽器的cookie值去 session 里做對比。session 就是用來在服務器端保存用戶的會話狀態。 cookie 可以有過期時間,這樣瀏覽器就知道什么時候可以刪除 cookie 了。 如果 cookie 沒有設置過期時間,當用戶關閉瀏覽器的時候,cookie 就自動過期了。
你可以改變SESSION_EXPIRE_AT_BROWSER_CLOSE 的設置來控制 session 框架的這一行為。
缺省情況下,SESSION_EXPIRE_AT_BROWSER_CLOSE 設置為 False ,這樣,會話 cookie 可以在用戶瀏覽器中保持有效達 SESSION_COOKIE_AGE 秒(缺省設置是兩周,即 1,209,600 秒)
如果你不想用戶每次打開瀏覽器都必須重新登陸的話,用這個參數來幫你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE設置為 True,當瀏覽器關閉時,Django 會使 cookie 失效。 SESSION_COOKIE_AGE:設置 cookie 在瀏覽器中存活的時間。
19.代碼優化從哪些方面考慮?有什么想法?
1、優化算法時間算法的時間復雜度對程序的執行效率影響最大,在 Python 中可以通過選擇合適的數據結構來優化時間復雜度,如 list 和 set 查找某一個元素的時間復雜度分別是 O(n)和 O(1)。
不同的場景有不同的優化方式,總得來說,一般有分治,分支界限,貪心,動態規劃等思想。
2、循環優化 每種編程語言都會強調需要優化循環。當使用 Python 的時候,你可以依靠大量的技巧使得循環運行得更快。然而,開發者經常漏掉的一個方法是:避免在一個循環中使用點操作。
每一次你調用方法 str.upper,Python 都會求該方法的值。然而,如果你用一個變量代替求得的值,值就變成了已知的,Python 就可以更快地執行任務。
優化循環的關鍵,是要減少 Python 在循環內部執行的工作量,因為 Python 原生的解釋器在那種情況下,真的會減緩執行的速度。
(注意:優化循環的方法有很多,這只是其中的一個。例如,許多程序員都會說,列表推導是在循環中提高執行速度的最好方式。這里的關鍵是,優化循環是程序取得更高的執行速度的更好方式之一。)
3、函數選擇 在循環的時候使用 xrange 而不是 range;使用 xrange 可以節省大量的系統內存,因為 xrange()在序列中每次調用只產生一個整數元素。
而 range()將直接返回完整的元素列表,用于循環時會有不必要的開銷。在 python3 中 xrange 不再存在,里面 range 提供一個可以遍歷任意長度的范圍的iterator。
4、并行編程 因為 GIL 的存在,Python 很難充分利用多核 CPU 的優勢。但是,可以通過內置的模塊 multiprocessing 實現下面幾種并行模式: 多進程:對于 CPU 密集型的程序,可以使用 multiprocessing 的 Process,Pool 等封裝好的類,通過多進程的方式實現并行計算。
但是因為進程中的通信成本比較大,對于進程之間需要大量數據交互的程序效率未必有大的提高。 多線程:對于 IO 密集型的程序,multiprocessing.dummy 模塊使用 multiprocessing 的接口封裝 threading,使得多線程編程也變得非常輕松(比如可以使用 Pool 的 map 接口,簡潔高效)。 分布式:multiprocessing 中的 Managers 類提供了可以在不同進程之共享數據的方式,可以在此基礎上開發出分布式的程序。不同的業務場景可以選擇其中的一種或幾種的組合實現程序性能的優化。
5、使用性能分析工具 除了上面在 ipython 使用到的 timeit 模塊,還有 cProfile。cProfile 的使用方式也非常簡單: python-mcProfilefilename.py,filename.py 是要運行程序的文件名,可以在標準輸出中看到每一個函數被調用的次數和運行的時間,從而找到程序的性能瓶頸,然后可以有針對性地優化。
6、set 的用法 set 的 union,intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的問題可以轉換為 set 來操作。
7、PyPy PyPy 是用 RPython(CPython 的子集)實現的 Python,根據官網的基準測試數據,它比 CPython實現的 Python 要快 6 倍以上。
快的原因是使用了 Just-in-Time(JIT)編譯器,即動態編譯器,與靜態編譯器(如 gcc,javac 等)不同,它是利用程序運行的過程的數據進行優化。
由于歷史原因,目前 pypy中還保留著 GIL,不過正在進行的 STM 項目試圖將 PyPy 變成沒有 GIL 的 Python。如果 python程序中含有 C 擴展(非 cffi 的方式),JIT 的優化效果會大打折扣,甚至比 CPython 慢(比 Numpy)。
所以在 PyPy 中最好用純 Python 或使用 cffi 擴展。
20.Django 中間件是如何使用的?
中間件不用繼承自任何類(可以繼承 object),下面一個中間件大概的樣子: 1. class CommonMiddleware(object): 2. def process_request(self, request): 3. return None 4. 5. def process_response(self, request, response): 6. return response還有 process_view, process_exception 和 process_template_response 函數。
1)初始化:無需任何參數,服務器響應第一個請求的時候調用一次,用于確定是否啟用當前中間件。 1. def __init__(self): 2. pass
2)處理請求前:在每個請求上,request 對象產生之后,url 匹配之前調用,返回 None 或HttpResponse 對象。 1. def process_request(self, request): 2. pass
3)處理視圖前:在每個請求上,url 匹配之后,視圖函數調用之前調用,返回 None 或HttpResponse 對象。 1. def process_view(self, request, view_func, *view_args,**view_kwargs): 2. pass
4)處理響應后:視圖函數調用之后,所有響應返回瀏覽器之前被調用,在每個請求上調用,返回 HttpResponse 對象。 1. def process_response(self, request, response): 2. pass
5)異常處理:當視圖拋出異常時調用,在每個請求上調用,返回一個 HttpResponse 對象。 1. def process_exception(self, request,exception): 2. pass
21.有用過 Django REST framework 嗎?
Django REST framework 是一個強大而靈活的 Web API 工具。使用 RESTframework 的理由有: Web browsable API 對開發者有極大的好處 包括 OAuth1a 和 OAuth2 的認證策略 支持 ORM 和非 ORM 數據資源的序列化 全程自定義開發——如果不想使用更加強大的功能,可僅僅使用常規的 function-based views 額外的文檔和強大的社區支持22.Celery 分布式任務隊列?
情景:用戶發起 request,并等待 response 返回。在某些 views 中,可能需要執行一段耗時的程序,那么用戶就會等待很長時間,造成不好的用戶體驗,比如發送郵件、手機驗證碼等。 使用 celery 后,情況就不一樣了。解決:
將耗時的程序放到 celery 中執行。 將多個耗時的任務添加到隊列 queue 中,也就是用 redis 實現 broker 中間人,然后用多個 worker 去監聽隊列里的任務去執行。? 任務 task:就是一個 Python 函數。? 隊列 queue:將需要執行的任務加入到隊列中。? 工人 worker:在一個新進程中,負責執行隊列中的任務。? 代理人 broker:負責調度,在布置環境中使用 redis。
23.Jieba 分詞
Jieba 分詞支持三種分詞模式:精確模式:試圖將句子最精確地切開,適合文本分析;全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞 功能:分詞,添加自定義詞典,關鍵詞提取,詞性標注,并行分詞,Tokenize:返回詞語在原文的起始位置,ChineseAnalyzer for Whoosh 搜索引擎。24.ngnix 的正向代理與反向代理?
web 開發中,部署方式大致類似。簡單來說,使用 Nginx 主要是為了實現分流、轉發、負載均衡,以及分擔服務器的壓力。Nginx 部署簡單,內存消耗少,成本低。Nginx 既可以做正向代理,也可以做反向代理。正向代理:請求經過代理服務器從局域網發出,然后到達互聯網上的服務器。 特點:服務端并不知道真正的客戶端是誰。
反向代理:請求從互聯網發出,先進入代理服務器,再轉發給局域網內的服務器。 特點:客戶端并不知道真正的服務端是誰。
區別:正向代理的對象是客戶端。反向代理的對象是服務端。
25.簡述 Django 下的(內建的)緩存機制?
一個動態網站的基本權衡點就是,它是動態的。 每次用戶請求頁面,服務器會重新計算。從開銷處理的角度來看,這比你讀取一個現成的標準文件的代價要昂貴的多。這就是需要緩存的地方。Django 自帶了一個健壯的緩存系統來保存動態頁面這樣避免對于每次請求都重新計算。
方便起見,Django 提供了不同級別的緩存粒度:可以緩存特定視圖的輸出、可以僅僅緩存那些很難生產出來的部分、或者可以緩存整個網站 Django 也能很好的配合那些“下游”緩存, 比如 Squid 和基于瀏覽器的緩存。
這里有一些緩存不必要直接去控制但是可以提供線索, (via HTTPheaders)關于網站哪些部分需要緩存和如何緩存。 設置緩存:緩存系統需要一些設置才能使用。 也就是說,你必須告訴他你要把數據緩存在哪里,是數據庫中,文件系統或者直接在內存中。
這個決定很重要,因為它會影響你的緩存性能,是的,一些緩存類型要比其他的緩存類型更快速。 你的緩存配置是通過 setting 文件的 CACHES 配置來實現的。 這里有 CACHES 所有可配置的變量值。
https://yiyibooks.cn/xx/django_182/topics/cache.html
26.請簡述瀏覽器是如何獲取一枚網頁的?
1.在用戶輸入目的 URL 后,瀏覽器先向 DNS 服務器發起域名解析請求; 2.在獲取了對應的 IP 后向服務器發送請求數據包; 3.服務器接收到請求數據后查詢服務器上對應的頁面,并將找到的頁面代碼回復給客戶端; 4.客戶端接收到頁面源代碼后,檢查頁面代碼中引用的其他資源,并再次向服務器請求該資源; 5.在資源接收完成后,客戶端瀏覽器按照頁面代碼將頁面渲染輸出顯示在顯示器上;27. 對 cookie 與 session 的了解?他們能單獨用嗎?
Session 采用的是在服務器端保持狀態的方案,而 Cookie 采用的是在客戶端保持狀態的方案。但是禁用 Cookie 就不能得到 Session。因為 Session 是用 Session ID 來確定當前對話所對應的服務 器 Session,而 Session ID 是通過 Cookie 來傳遞的,禁用 Cookie 相當于失去了 SessionID,也就得不到 Session。28. Django HTTP 請求的處理流程?
Django 和其他 Web 框架的 HTTP 處理的流程大致相同,Django 處理一個 Request 的過程是首先通過中間件,然后再通過默認的 URL 方式進行的。我們可以在 Middleware 這個地方把所有Request 攔截住,用我們自己的方式完成處理以后直接返回 Response。
1. 加載配置 Django 的配置都在 “Project/settings.py” 中定義,可以是 Django 的配置,也可以是自定義的配置,并且都通過 django.conf.settings 訪問,非常方便。 2. 啟動 最核心動作的是通過 django.core.management.commands.runfcgi 的 Command 來啟動,它運行 django.core.servers.fastcgi 中的 runfastcgi,runfastcgi 使用了 flup 的 WSGIServer 來啟動 fastcgi 。
而 WSGIServer 中攜帶了 django.core.handlers.wsgi 的 WSGIHandler 類的一個實例,通過 WSGIHandler 來處理由 Web 服務器(比如 Apache,Lighttpd 等)傳過來的請求,此時才是真正進入 Django 的世界。 3. 處理 Request 當有 HTTP 請求來時,WSGIHandler 就開始工作了,它從 BaseHandler 繼承而來。WSGIHandler 為每個請求創建一個 WSGIRequest 實例,而 WSGIRequest 是從http.HttpRequest 繼承而來。接下來就開始創建 Response 了。 4. 創建 Response BaseHandler 的 get_response 方法就是根據 request 創建 response,而具體生成response 的動作就是執行 urls.py 中對應的 view 函數了,這也是 Django 可以處理“友好 URL ”的關鍵步驟,每個這樣的函數都要返回一個 Response 實例。
此時一般的做法是通過 loader 加載template 并生成頁面內容,其中重要的就是通過 ORM 技術從數據庫中取出數據,并渲染到Template 中,從而生成具體的頁面了。 5. 處理 Response Django 返回 Response 給 flup,flup 就取出 Response 的內容返回給 Web 服務器,由后者返回給瀏覽器。 總之,Django 在 fastcgi 中主要做了兩件事:處理 Request 和創建 Response,而它們對應的核心就是“ urls 分析”、“模板技術”和“ ORM 技術”。
29.Django 里 QuerySet 的 get 和 filter 方法的區別?
1) 輸入參數 get 的參數只能是 model 中定義的那些字段,只支持嚴格匹配。 filter 的參數可以是字段,也可以是擴展的 where 查詢關鍵字,如 in,like 等。 2) 返回值 get 返回值是一個定義的 model 對象。 filter 返回值是一個新的 QuerySet 對象,然后可以對 QuerySet 在進行查詢返回新的 QuerySet對象,支持鏈式操作,QuerySet 一個集合對象,可使用迭代或者遍歷,切片等,但是不等于 list 類型(使用一定要注意)。 3) 異常 get 只有一條記錄返回的時候才正常,也就說明 get 的查詢字段必須是主鍵或者唯一約束的字段。當返回多條記錄或者是沒有找到記錄的時候都會拋出異常 filter 有沒有匹配的記錄都可以30-34
30. django 中當一個用戶登錄 A 應用服務器(進入登錄狀態),然后下次請求被 nginx代理到 B 應用服務器會出現什么影響? 如果用戶在 A 應用服務器登陸的 session 數據沒有共享到 B 應用服務器,那么之前的登錄狀態就沒有了。31. 跨域請求問題 django 怎么解決的(原理) ? 啟用中間件 ? post 請求 ? 驗證碼 ? 表單中添加 csrf_token 標簽
32. Django 對數據查詢結果排序怎么做,降序怎么做,查詢大于某個字段怎么做? ? 排序使用 order_by() ? 降序需要在排序字段名前加- ? 查詢字段大于某個值:使用 filter(字段名_gt=值)
33. Django 重定向你是如何實現的?用的什么狀態碼? ? 使用 HttpResponseRedirect ? redirect ? 狀態碼:302,30134. 生成遷移文件和執行遷移文件的命令是什么? python manage.py makemigrations python manage.py migrate?
35.關系型數據庫的關系包括哪些類型?
? ForeignKey:一對多,將字段定義在多的一端中。 ? ManyToManyField:多對對:將字段定義在兩端中。 ? OneToOneField:一對一,將字段定義在任意一端中。36.查詢集返回列表的過濾器有哪些?
? all() :返回所有的數據 ? filter():返回滿足條件的數據 ? exclude():返回滿足條件之外的數據,相當于 sql 語句中 where 部分的 not 關鍵字 ? order_by():排序37.判斷查詢集正是否有數據??
exists():判斷查詢集中否有數據,如果有則返回 True,沒有則返回 False。?
38.Django 本身提供了 runserver,為什么不能用來部署?
runserver 方法是調試 Django 時經常用到的運行方式,它使用 Django 自帶的 WSGI Server 運行,主要在測試和開發中使用,并且 runserver 開啟的方式也是單進程 。 uWSGI 是一個 Web 服務器,它實現了 WSGI 協議、uwsgi、http 等協議。注意 uwsgi 是一種通信協議,而 uWSGI 是實現 uwsgi 協議和 WSGI 協議的 Web 服務器。uWSGI 具有超快的性能、低內存占用和多 app 管理等優點,并且搭配著 Nginx 就是一個生產環境了,能夠將用戶訪問請求與應用 app 隔離開,實現真正的部署。
相比來講,支持的并發量更高,方便管理多進程,發揮多核的優勢,提升性能。
39.apache 和 nginx 的區別?
Nginx 相對 Apache 的優點: 輕量級,同樣起 web 服務,比 apache 占用更少的內存及資源; 抗并發,nginx 處理請求是異步非阻塞的,支持更多的并發連接,而 apache 則是阻塞型的,在高并發下 nginx 能保持低資源低消耗高性能; 配置簡潔; 高度模塊化的設計,編寫模塊相對簡單; 社區活躍。Apache 相對 Nginx 的優點: rewrite ,比 nginx 的 rewrite 強大; 模塊超多,基本想到的都可以找到; 少 bug ,nginx 的 bug 相對較多; 超穩定。
40.varchar 與 char 的區別?
char 長度是固定的,不管你存儲的數據是多少他都會都固定的長度。而 varchar 則處可變長度但他要在總長度上加 1 字符,這個用來存儲位置。所以在處理速度上 char 要比 varchar 快速很多,但是對費存儲空間,所以對存儲不大,但在速度上有要求的可以使用 char 類型,反之可以用 varchar 類型。
41.查詢集兩大特性?惰性執行?
惰性執行、緩存 。 創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與 if 合用42.git 常用命令?
git clone 克隆指定倉庫 git status 查看當前倉庫狀態 git diff 比較版本的區別 git log 查看 git 操作日志 git reset 回溯歷史版本 git add 將文件添加到暫存區 git commit 將文件提交到服務器 git checkout 切換到指定分支 git rm 刪除指定文件43.電商網站庫存問題
一般團購,秒殺,特價之類的活動,這樣會使訪問量激增,很多人搶購一個商品,作為活動商品, 庫存肯定是很有限的。控制庫存問題,數據庫的事務功能是控制庫存超賣的有效方式。 1.在秒殺的情況下,肯定不能如此頻率的去讀寫數據庫,嚴重影響性能問題,必須使用緩存,將需要秒殺的商品放入緩存中,并使用鎖來處理并發情況,先將商品數量增減(加鎖、解析)后在進行其他方面的處理,處理失敗再將數據遞增(加鎖、解析),否則表示交易成功。 2.這個肯定不能直接操作數據庫的,會掛的。直接讀庫寫庫對數據庫壓力太大了,要用到緩存。 3.首先,多用戶并發修改同一條記錄時,肯定是后提交的用戶將覆蓋掉前者提交的結果了。這個直接可以使用加樂觀鎖的機制去解決高并發的問題。
44.HttpRequest 和 HttpResponse 是什么?干嘛用的?
HttpRequest 是 django 接受用戶發送多來的請求報文后,將報文封裝到 HttpRequest 對象中去。 HttpResponse 返回的是一個應答的數據報文。render 內部已經封裝好了 HttpResponse 類。 視圖的第一個參數必須是 HttpRequest 對象,兩點原因:表面上說,他是處理 web 請求的,所以必須是請求對象,根本上說,他是基于請求的一種 web 框架,所以,必須是請求對象。 因為 view 處理的是一個 request 對象,請求的所有屬性我們都可以根據對象屬性的查看方法來獲取具體的信息:格式:
request.屬性request.path 請求頁面的路徑,不包含域名request.get_full_path 獲取帶參數的路徑request.method 頁面的請求方式request.GET GET 請求方式的數據request.POST POST 請求方式的數據request.COOKIES 獲取 cookierequest.session 獲取 sessionrequest.FILES 上傳圖片(請求頁面有 enctype="multipart/form-data"屬性時 FILES 才有數據。?a=10 的鍵和值時怎么產生的,鍵是開發人員在編寫代碼時確定下來的,值時根據數據生成或者用戶填寫的,總之是不確定的。
403 錯誤:表示資源不可用,服務器理解客戶的請求,但是拒絕處理它,通常由于服務器上文件和目錄的權限設置導致的 web 訪問錯誤。
如何解決:
1、把中間件注釋。
2、在表單內部添加{% scrf_token %} request.GET.get()取值時如果一鍵多值情況,get 是覆蓋的方式獲取的。getlist()可以獲取多個值。
在一個有鍵無值的情況下,該鍵名 c 的值返回空。有鍵無值:c: getlist 返回的是列表,空列表在無鍵無值也沒有默認值的情況下,返回的是 None 無鍵無值:e:None
HttpResponse 常見屬性:content: 表示返回的內容charset: 表示 response 采用的編碼字符集,默認是 utf-8status_code:返回的 HTTP 響應狀態碼 3XX 是對請求繼續進一步處理,常見的是重定向。 常見方法:init:創建 httpResponse 對象完成返回內容的初始化set_cookie:設置 Cookie 信息:格式:set_cookies('key','value',max_age=None,expires=None)max_age 是一個整數,表示指定秒數后過期,expires 指定過期時間,默認兩個星期后過期。write 向響應體中寫數據 應答對象: 方式一:render(request,"index.html") 返回一個模板render(request,"index.html", context) 返回一個攜帶動態數據的頁面 方式二:render_to_response("index.html") 返回一個模板頁面 方式三:redirect("/") 重定向 方式四:HttpResponseRdeirect("/") 實現頁面跳轉功能 方式五:HttpResponse("itcast1.0")在返回到額頁面中添加字符串內容 方式六:JsonResponse () 返回的頁面中添加字符串內容。
JsonResponse 創建對象時候接收字典作為參數,返回的對象是一個 json 對象。 能接收 Json 格式數據的場景,都需要使用 view 的 JsonResponse 對象返回一個 json 格式數據ajax 的使用場景,頁面局部刷新功能。ajax 接收 Json 格式的數據。 在返回的應答報文中,可以看到 JsonResponse 應答的 content-Type 內容是 application/json ajax 實現網頁局部刷新功能:ajax 的 get()方法獲取請求數據 ajax 的 each()方法遍歷輸出這些數據
45.什么是反向解析
使用場景:模板中的超鏈接,視圖中的重定向 使用:在定義 url 時,為 include 定義 namespace 屬性,為 url 定義 name 屬性 在模板中使用 url 標簽:{% url 'namespace_value:name_value'%} 在視圖中使用 reverse 函數:redirect(reverse('namespce_value:name_value')) 根據正則表達式動態生成地址,減輕后期維護成本。 注意反向解析傳參數,主要是在我們的反向解析的規則后面添加了兩個參數,兩個參數之間使用空格隔開:<a href="{% url 'booktest:fan2' 2 3 %}">位置參數</a>46.Django 日志管理
配置好之后: import logging logger=logging.getLogger(__name__) # 為 loggers 中定義的名稱 logger.info("some info ...) 可用函數有:logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical() Django 文件管理:對于 jdango 來說,項目中的 css,js,圖片都屬于靜態文件,我們一般會將靜態文件放到一個單獨的目錄中,以方便管理,在 html 頁面調用時,也需要指定靜態文件的路徑。
靜態文件可以放在項目根目錄下,也可以放在應用的目錄下,由于這些靜態文件在項目中是通用的,所以推薦放在項目的根目錄下。 在生產中,只要和靜態文件相關的,所有訪問,基本上沒有 django 什么事,一般都是由 nignx 軟件代勞了,為什么?因為 nginx 就是干這個的。
?
三. Tornado
1. Tornado 的核是什么?
通過向 ioloop 中添加網絡 I/O 事件,利用無阻塞的 socket ,再搭配相應的回調函數,便可達到夢寐以求的高效異步執行。
?
?
?
?
轉載于:https://www.cnblogs.com/wenyule/articles/10469659.html
總結
以上是生活随笔為你收集整理的bd5.2 Django的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于可观察性的三大支柱,你应该了解这些
- 下一篇: 2019 阿里云峰会·北京站正式启动,互