個人面試筆記

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被開發出來之後,許多其它語言中也出現了相似接口。html

WSGI區分爲兩個部分:一爲「服務器」或「網關」,另外一爲「應用程序」或「應用框架」。在處理一個WSGI請求時,服務器會爲應用程序提供環境信息及一個回調函數(Callback Function)。當應用程序完成處理請求後,透過前述的回調函數,將結果回傳給服務器。python

所謂的 WSGI 中間件同時實現了API的兩方,所以能夠在WSGI服務器和WSGI應用之間起調解做用:從Web服務器的角度來講,中間件扮演應用程序,而從應用程序的角度來講,中間件扮演服務器。「中間件」組件能夠執行如下功能:git

  • 重寫環境變量後,根據目標URL,將請求消息路由到不一樣的應用對象。
  • 容許在一個進程中同時運行多個應用程序或應用框架。
  • 負載均衡和遠程處理,經過在網絡上轉發請求和響應消息。
  • 進行內容後處理,例如應用XSLT樣式表。

實現該協議的模塊:web

  • wsgiref
  • werkzurg
  • uwsig

3.視圖的玩法

FBV——url —— 函數redis

CBV——url —— view數據庫

4.RESTful規範

什麼是RESTful架構:django

  (1)每個URI表明一種資源;json

  (2)客戶端和服務器之間,傳遞這種資源的某種表現層;api

  (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握手與揮手

2、 項目相關:

1. 請講一下你作的在線商城的表結構

  • 課程(13表)
    • 課程大類
    • 課程子類
    • 學位課
      • 講師
      • 獎學金
    • 專題課(學位課模塊表)
    • 價格策略(contenttype)
    • 課程詳細(o2o -> 水平分表)
    • 常見問題
    • 課程大綱
    • 章節
    • 課時
    • 做業
  • 深科技(4+2)
    • 用戶表
    • 用戶token
    • 文章來源
    • 文章表
    • 通用評論表
    • 通用收藏表

2. 支付寶功能

  • 加密方式:rsa
  • 公鑰私鑰:
    • 商戶私鑰
      • 支付寶公鑰
  • 支付成功後,斷電宕機
    • 成功:return HttpResponse('success')

3. 數據庫頁數越大速度越慢,如何解決

  • 限制頁數
  • 記錄當前頁最大ID、最小ID
  • 錯誤答案:
    • 掃描索引表
    • 再去數據庫表中獲取數據

4. redis是什麼?

用於操做內存的軟件。

  • 能夠作持久化:

    • AOF
    • RDB
  • 至關因而大字典

  • 單進程單線程

3、 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
相關文章
相關標籤/搜索