1. 程式人生 > >我的面試筆記

我的面試筆記

一、WEB框架

1. 請簡述django請求生命週期

  • 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端
  • 服務端的wsgiref模組接收使用者請求並將請求進行初次封裝
  • 將請求交給Django的中介軟體
  • 通過中介軟體之後將請求交給url,根據瀏覽器傳送的不同url去匹配不同的檢視函式
  • 檢視函式根據業務邏輯呼叫資料庫獲取相應的資料,然或根據模板渲染頁面
  • 檢視函式將響應的頁面依次通過中介軟體
  • 到達wsgi,封裝資料後反饋給客戶端

    wsgi.png

2. 什麼wsgi

Web伺服器閘道器介面Python Web Server Gateway Interface

,縮寫為WSGI)是為Python語言定義的Web伺服器Web應用程式框架之間的一種簡單而通用的介面。自從WSGI被開發出來以後,許多其它語言中也出現了類似介面。

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. 分頁


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:

  1. 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'])
  1. 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)
  1. 原生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(..)
  1. 選擇資料庫
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