我的面試筆記
一、WEB框架
1. 請簡述django請求生命週期
- 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端
- 服務端的wsgiref模組接收使用者請求並將請求進行初次封裝
- 將請求交給Django的中介軟體
- 通過中介軟體之後將請求交給url,根據瀏覽器傳送的不同url去匹配不同的檢視函式
- 檢視函式根據業務邏輯呼叫資料庫獲取相應的資料,然或根據模板渲染頁面
- 檢視函式將響應的頁面依次通過中介軟體
- 到達wsgi,封裝資料後反饋給客戶端
2. 什麼wsgi
Web伺服器閘道器介面(Python Web Server Gateway Interface
WSGI區分為兩個部分:一為“伺服器”或“閘道器”,另一為“應用程式”或“應用框架”。在處理一個WSGI請求時,伺服器會為應用程式提供環境資訊及一個回撥函式(Callback Function)。當應用程式完成處理請求後,透過前述的回撥函式,將結果回傳給伺服器。
所謂的 WSGI 中介軟體同時實現了API的兩方,因此可以在WSGI伺服器和WSGI應用之間起調解作用:從Web伺服器的角度來說,中介軟體扮演應用程式,而從應用程式的角度來說,中介軟體扮演伺服器。“中介軟體”元件可以執行以下功能:
- 重寫環境變數後,根據目標URL,將請求訊息路由到不同的應用物件。
- 允許在一個程序中同時執行多個應用程式或應用框架。
- 負載均衡和遠端處理,通過在網路上轉發請求和響應訊息。
- 進行內容後處理,例如應用XSLT樣式表。
實現該協議的模組:
- wsgiref
- werkzurg
- uwsig
3.檢視的玩法
FBV——url —— 函式
CBV——url —— view
4.RESTful規範
什麼是RESTful架構:
(1)每一個URI代表一種資源;
(2)客戶端和伺服器之間,傳遞這種資源的某種表現層;
(3)客戶端通過四個HTTP動詞,對伺服器端資源進行操作,實現"表現層狀態轉化"。
5.django rest framework框架
1. 路由
- 可以通過as_view傳引數,根據請求方式不同執行相應的方法
- 可以在url中設定一個結尾,類似於: .json
2. 檢視
- 幫助開發者提供了一些類,並在類中提供了多個方法以供我們使用
3. 版本
- 在url中設定version引數,使用者請求時候傳入引數。在request.version中獲取版本,根據版本不同做不同處理
4. 認證
寫一個類並註冊到認證類,在類的的authticate方法中編寫認證邏輯。
- 認證成功(user,auth)
- raise AuthticateFaild(....)
- None
5. 許可權
寫一個類並註冊到許可權類,在類的的has_permission方法中編寫認證邏輯。
- True
- False
6. 頻率限制
寫一個類並註冊到頻率類,在類的的 allow_request/wait 方法中編寫認證邏輯。
allow_request
True
False 如果返回False,那麼就要執行wait
7. 解析器
根據ContentType請求頭,選擇不同解析器對 請求體中的資料進行解析。
- POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo.... \r\n\r\nuser=alex&age=123
POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:application/json\r\n\r\n{....}
8. 分頁
- 對從資料庫中獲取到的資料進行分頁處理: SQL -> limit offset
6. 頁碼越大速度越慢,為什麼以及如何解決?
原因:頁碼越大向後需要掃描的行數越多,因為每次都是從0開始掃描。
解決:
- 限制顯示的頁數
- 記錄當前頁資料ID最大值和最小值,再次分頁時,根據ID現行篩選,然後再分頁。
7. 三次握手與四次揮手
答案詳解:TCP握手與揮手
二、 專案相關:
1. 請講一下你做的線上商城的表結構
- 課程(13表)
- 課程大類
- 課程子類
- 學位課
- 講師
- 獎學金
- 專題課(學位課模組表)
- 價格策略(contenttype)
- 課程詳細(o2o -> 水平分表)
- 常見問題
- 課程大綱
- 章節
- 課時
- 作業
- 深科技(4+2)
- 使用者表
- 使用者token
- 文章來源
- 文章表
- 通用評論表
- 通用收藏表
2. 支付寶功能
- 加密方式:rsa
- 公鑰私鑰:
- 商戶私鑰
- 支付寶公鑰
- 商戶私鑰
- 支付成功後,斷電宕機
- 成功:return HttpResponse('success')
3. 資料庫頁數越大速度越慢,如何解決
- 限制頁數
- 記錄當前頁最大ID、最小ID
- 錯誤答案:
- 掃描索引表
- 再去資料庫表中獲取資料
4. redis是什麼?
用於操作記憶體的軟體。
- 可以做持久化:
- AOF
- RDB
相當於是大字典
單程序單執行緒
三、 Django
1. 講述一些ORM操作
select_related,連表操作,相當於主動做join
prefeth_related,多次單表操作,先查詢想要的資料,然後構造條件,如:id=[1,2,3],再次查詢其他表根據id做條件。
only
defer
F
Q
通過ORM寫偏原生SQL:
- extra
Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
Entry.objects.extra(select={'new_id': "select id from tb where id > %s"},select_params=(1,), order_by=['-nid'])
- raw
# 執行原生SQL
models.UserInfo.objects.raw('select * from userinfo')
# 如果SQL是其他表時,必須將名字設定為當前UserInfo物件的主鍵列名
models.UserInfo.objects.raw('select id as nid from 其他表')
# 為原生SQL設定引數
models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
- 原生SQL
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone() # fetchall()/fetchmany(..)
- 選擇資料庫
queryset = models.Course.objects.using('default').all()
?、其他
1. git的作用是什麼
進行版本控制,實現協同開發
2. git命令與意義
- git init
- git add
- git status
- git commit
- git log
- git reflog
- git reset --hard
- git checkout