1. 程式人生 > >路飛學城Python-Day136

路飛學城Python-Day136

列舉Http請求中常見的請求方式 根據HTTP標準,HTTP請求可以使用多種請求方法。 HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法    
序號 方法 描述
1 GET 請求指定的頁面資訊,並返回實體主體。
2 HEAD 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
4 PUT 從客戶端向伺服器傳送的資料取代指定的文件的內容。
5 DELETE 請求伺服器刪除指定的頁面。
6 CONNECT HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
7 OPTIONS 允許客戶端檢視伺服器的效能。
8 TRACE 回顯伺服器收到的請求,主要用於測試或診斷。
  談談你對HTTP協議的認識。什麼是長連線 http協議是基於網路應用層的,對伺服器和客戶端(瀏覽器)之間的一種傳輸超文字的傳送協議 長連線:HTTP的相應頭內有Connection:keep-alive 在使用長連線的情況下,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的 TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線。Keep-Alive不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。實現長連線要客戶端和服務端都支援長連線。 HTTP協議的長連線和短連線,實質上是TCP協議的長連線和短連線 HTTP協議特點     基於TCP/IP 計算機與網路裝置要相互通訊,雙方就必須基於相同的方法。比如,如何探測到通訊目標、由哪一邊先發起通訊、使用哪種語言進行通 信、怎樣結束通訊等規則都需要事先確定。不同的硬體、作業系統之間 的通訊,所有的這一切都需要一種規則。而我們就把這種規則稱為協議(protocol)。協議中存在各式各樣的內容。從電纜的規格到IP地址的選定方法、 尋找異地使用者的方法、雙方建立通訊的順序,以及Web頁面顯示需要 處理的步驟,等等。像這樣把與網際網路相關聯的協議集合起來總稱為TCP/IP。而http協議是基於TCP/IP協議之上的應用層協議。 基於請求-響應模式 HTTP協議規定,請求從客戶端發出,最後伺服器端響應該請求並 返回。換句話說,肯定是先從客戶端開始建立通訊的,伺服器端在沒有 接收到請求之前不會發送響應 無狀態儲存 HTTP是一種不儲存狀態,即無狀態(stateless)協議。HTTP協議 自身不對請求和響應之間的通訊狀態進行儲存。也就是說在HTTP這個 級別,協議對於傳送過的請求或響應都不做持久化處理。 使用HTTP協議,每當有新的請求傳送時,就會有對應的新響應產 生。協議本身並不保留之前一切的請求或響應報文的資訊。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把HTTP協議設計成 如此簡單的。可是,隨著Web的不斷髮展,因無狀態而導致業務處理變得棘手 的情況增多了。比如,使用者登入到一家購物網站,即使他跳轉到該站的 其他頁面後,也需要能繼續保持登入狀態。針對這個例項,網站為了能 夠掌握是誰送出的請求,需要儲存使用者的狀態。HTTP/1.1雖然是無狀態協議,但為了實現期望的保持狀態功能, 於是引入了Cookie技術。有了Cookie再用HTTP協議通訊,就可以管 理狀態了 無連線 無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。   簡述MVC模式和MVT模式 MVC模式 Web伺服器開發領域裡著名的MVC模式,所謂MVC就是把Web應用分為模型(M),控制器(C)和檢視(V)三層,他們之間以一種外掛式的、鬆耦合的方式連線在一起,模型負責業務物件與資料庫的對映(ORM),檢視負責與使用者的互動(頁面),控制器接受使用者的輸入呼叫模型和檢視完成使用者的請求,其示意圖如下所示 MVT模式 Django的MTV模式本質上和MVC是一樣的,也是為了各元件間保持鬆耦合關係,只是定義上有些許不同,Django的MTV分別是值:
  1. M 代表模型(Model): 負責業務物件和資料庫的關係對映(ORM)。
  2. T 代表模板 (Template):負責如何把頁面展示給使用者(html)。
  3. V 代表檢視(View): 負責業務邏輯,並在適當時候呼叫Model和Template。 除了以上三層之外,還需要一個URL分發器,它的作用是將一個個URL的頁面請求分發給不同的View處理,View再呼叫相應的Model和Template,MTV的響應模式如下所示
  • 簡述Django請求生命週期
一般是使用者通過瀏覽器向我們的伺服器發起一個請求(request),這個請求回去訪問檢視函式,(如果不涉及到資料呼叫,那麼這個時候檢視函式返回一個模板也就是一個網頁給使用者),檢視函式呼叫模型,模型去資料庫查詢資料,然後逐級返回,檢視函式把返回的資料填充到模板中空格中,最後返回網頁給使用者。 #1.wsgi,請求封裝後交給web框架 (Flask、Django)      #2.中介軟體,對請求進行校驗或在請求物件中新增其他相關資料,例如:csrf、request.session -  #3.路由匹配 根據瀏覽器傳送的不同url去匹配不同的檢視函式     #4.檢視函式,在檢視函式中進行業務邏輯的處理,可能涉及到:orm、templates => 渲染 -  #5.中介軟體,對響應的資料進行處理。  #6.wsgi,將響應的內容傳送給瀏覽器。   FBV(function base views) 就是在視圖裡使用函式處理請求 CBV(class base views) 就是在視圖裡使用類處理請求     Python是一個面向物件的程式語言,如果只用函式來開發,有很多面向物件的優點就錯失了(繼承、封裝、多型)。所以Django在後來加入了Class-Based-View。可以讓我們用類寫View。這樣做的優點主要下面兩種:
  1. 提高了程式碼的複用性,可以使用面嚮物件的技術,比如Mixin(多繼承)
  2. 可以用不同的函式針對不同的HTTP方法處理,而不是通過很多if判斷,提高程式碼可讀性
  • 談一談你對ORM的理解
ORM是“物件-關係-對映”的簡稱,ORM是一種模板語法,用於和資料庫進行互動。 MVC或者MVC框架中包括一個重要的部分,就是ORM,它實現了資料模型與資料庫的解耦,即資料模型的設計不需要依賴於特定的資料庫,通過簡單的配置就可以輕鬆更換資料庫,這極大的減輕了開發人員的工作量,不需要面對因資料庫變更而導致的無效勞動。
  • rest_framework 認證元件的流程
  • 什麼是中介軟體並簡述其作用
中介軟體顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出。因為改變的是全域性,所以需要謹慎實用,用不好會影響到效能
  • django中怎麼寫原生SQL
orm操作資料庫 class Book(models.Model): id=models.AutoField(primary_key=True) title=models.CharField(max_length=32) state=models.BooleanField() pub_date=models.DateField() price=models.DecimalField(max_digits=8,decimal_places=2) publish=models.CharField(max_length=32) book_obj=Book.objects.create(title="python葵花寶典",state=True,price=100,publish="蘋果出版社",pub_date="2012-12-12") <1> all(): 查詢所有結果 <2> filter(**kwargs): 它包含了與所給篩選條件相匹配的物件 <3> get(**kwargs): 返回與所給篩選條件相匹配的物件,返回結果有且只有一個, 如果符合篩選條件的物件超過一個或者沒有都會丟擲錯誤。 <4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的物件 <5> order_by(*field): 對查詢結果排序 <6> reverse(): 對查詢結果反向排序 <8> count(): 返回資料庫中匹配查詢(QuerySet)的物件數量。 <9> first(): 返回第一條記錄 <10> last(): 返回最後一條記錄 <11> exists(): 如果QuerySet包含資料,就返回True,否則返回False <12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,執行後得到的並不是一系列 model的例項化物件,而是一個可迭代的字典序列 <13> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 <14> distinct(): 從返回結果中剔除重複紀錄 model_obj.delete() Book.objects.filter(title__startswith="py").update(price=120)
  • F和Q的作用
F()函式的查詢是orm中將欄位之間進行比較,一般來說orm只是將常量做比較,這裡的f()函式就是將orm語句對資料庫中表的欄位與欄位之間作比較 Q()函式用於更復雜的查詢方式,一般Q()用於或的查詢或者帶符號的查詢(如|、&)
  • values和value_list區別
values返回的是一個字典 values_list返回的是一個元祖
  • 如何使用django orm批量建立資料
批量建立資料使用for迴圈,建立資料的時候儘量最後執行建立語句,使用django的語法 bulk_create product_list_to_insert = list() for x in range(10):     product_list_to_insert.append(Product(name='product name ' + str(x), price=x)) Product.objects.bulk_create(product_list_to_insert)  
  • Django中的請求生命週期
  • http訪問流程
  • 命令migrate 和makemigrations的差別
makemigrations命令是在app的內部生成一系列檔案,為後續的資料庫檔案生成做準備(有相應的sql語句但是未執行) migrate則是對資料庫進行表操作(sql語句會執行)
  • 檢視函式中,接收的請求物件常用方法和屬性有哪些
1.request.method == 'GET' 2.request.method == 'POST'
  • 常用檢視響應的方式是什麼?
1.Httpreponse 2.render 3.redirect
  • HTTP響應常見狀態碼分類
   
分類 分類描述
1** 資訊,伺服器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤
  常見的HTTP狀態碼: 200 - 請求成功 301 - 資源(網頁等)被永久轉移到其它URL 404 - 請求的資源(網頁等)不存在       500 - 內部伺服器錯誤  
  • 路由匹配原則是什麼?
路由選擇的最長匹配原則 最長匹配原則是我司支援IP路由的裝置預設的路由查詢方式(事實上幾乎所有支援IP路由的裝置都是這種查詢方式)。 當路由器收到一個IP資料包時,會將資料包的目的IP地址與自己本地路由表中的表項進行bit by bit的逐位查詢,直到找到匹配度最長的條目,這叫最長匹配原則
  • 快取系統型別有哪些
要使用快取系統需要先在settings.py中設定,Django提供多種快取型別:Memcached快取,資料庫快取,檔案系統快取,區域性記憶體快取和自定義快取等
  • 解決跨域的常用方式是什麼?
跨域是指一個域下的文件或指令碼試圖去請求另一個資源下的資源 跨域分三種方式的跨域連線 1.資源跳轉:A標籤連線、重定向、表單提交 2.資源嵌入:link srcipt img 等dom標籤,其他的樣式連線方式:background: url,@xxxx等引入的方式 3.指令碼請求:js發起的ajax請求、dom和js物件的跨域操作等  
  • 訊號的作用是什麼?
Django的Siganl是一個“訊號發生器”,它是設計模式中經常提到的觀察者模式的一個實現應用 在此模式中,一個目標物件管理所有依賴於它的觀察者物件,並且在它本身的狀態改變時,主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。   優點 解除耦合,讓耦合的雙方都依賴於抽象,從而使得各自的變換都不會影響另一邊的變換。   它在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的介面。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的介面。   由於被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬於不同的抽象化層次。這種耦合性使得程式碼的可讀性、維護性大大提高。   觀察者模式實現了動態聯動;   由於觀察者模式對觀察者註冊實行管理,那就可以在執行期間,通過動態的控制註冊的觀察者來控制某個動作的聯動範圍,從而實現動態聯動。   觀察者模式支援廣播通訊。   目標傳送通知給觀察者是面向所有註冊的觀察者,所以目標每次通知的資訊就要對所有註冊的觀察者進行廣播,也可以在目標上新增新的方法來限制廣播的範圍。 --------------------- 作者:SuPhoebe 來源:CSDN 原文:https://blog.csdn.net/u013007900/article/details/78110891 版權宣告:本文為博主原創文章,轉載請附上博文連結!
  • Django的Model的繼承有幾種形式,分別是什麼
Django 中有三種繼承關係: 1. 通常你只是需要一個父類來儲存子類所共有的欄位而避免重複的在多個子類中定義,這個父類永遠不打算單獨使用,這種情況你可以選擇 Abstract base classes。 2. 如果你要繼承一個已經存在的 model,並且每個 model 都有其獨立的資料表,你可以選擇 Multi-table inheritance。 3. 如果你只想改變一個 model Python-level 的行為而不修改其欄位,你可以選擇 Proxy Model。
  • Django中查詢queryset時什麼情況下用Q
Django的Q 查詢方式是用於複雜型別的查詢方式,比如要用到"或"和“和”查詢方式的時候就會使用 from django.db.models import Q Q(title__startswith='Py') Q 物件可以使用& 和| 操作符組合起來。當一個操作符在兩個Q 物件上使用時,它產生一個新的Q 物件。 bookList=Book.objects.filter(Q(authors__name="yuan")|Q(authors__name="egon")) 等同於下面的SQL WHERE 子句: WHERE name ="yuan" OR name ="egon" 你可以組合& 和|  操作符以及使用括號進行分組來編寫任意複雜的Q 物件。同時,Q 物件可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢: bookList=Book.objects.filter(Q(authors__name="yuan") & ~Q(publishDate__year=2017)).values_list("title") 查詢函式可以混合使用Q 物件和關鍵字引數。所有提供給查詢函式的引數(關鍵字引數或Q 物件)都將"AND”在一起。但是,如果出現Q 物件,它必須位於所有關鍵字引數的前面。例如: bookList=Book.objects.filter(Q(publishDate__year=2016) | Q(publishDate__year=2017),                               title__icontains="python"                              )
  • Django中想驗證表單提交是否格式正確需要用到Form中的哪個函式
不管表單提交的是什麼資料,一旦通過呼叫is_valid() 成功驗證(is_valid() 返回True),驗證後的表單資料將位於form.cleaned_data 字典中。這些資料已經為你轉換好為Python 的型別。 注:此時,你依然可以從request.POST 中直接訪問到未驗證的資料,但是訪問驗證後的資料更好一些。
  • orm如何取消級聯
級聯就是我們說的連表的操作,連表將會使表之間通過各種關係連線起來,但是orm刪除的時候是指定欄位的,所以需要在model的表中通過外來鍵連線設定級聯關係刪除 user = models.FroeignKey(User, blank=True, null=True, on_delete=models.SET_NULL) 需要注意的是on_delete=models.SET_NULL的前提必須是null=true 該屬性還有其他值可選:   CASCADE: 預設的,級聯刪除   PROTECT: 通過丟擲django.db.models.ProtectedErrordjango.db.models.ProtectedError錯誤來阻止刪除關聯的物件   SET_NULL: 設定ForeignKey 為 null; 這個只有設定了null 為 True的情況才能用   SET_DEFAULT: 設定 ForeignKey 為預設值; 預設值必須預先設定   SET(): 設定為某個方法返回的值   DO_NOTHING: 什麼都不做,如果資料庫設定必須關聯則會報IntegrityError錯。 --------------------- 作者:happy_walker 來源:CSDN 原文:https://blog.csdn.net/happyteafriends/article/details/8687987 版權宣告:本文為博主原創文章,轉載請附上博文連結!  
  • Django中如何讀取和儲存session,整個session的執行機制是什麼
cookies和session都屬於一種會話跟蹤技術 Session是伺服器端技術,利用這個技術,伺服器在執行時可以 為每一個使用者的瀏覽器建立一個其獨享的session物件,由於 session為使用者瀏覽器獨享,所以使用者在訪問伺服器的web資源時 ,可以把各自的資料放在各自的session中,當用戶再去訪問該伺服器中的其它web資源時,其它web資源再從使用者各自的session中 取出資料為使用者服務。 1.在中介軟體中配置session啟用(預設啟用)   1、設定Sessions值           request.session['session_name'] ="admin" 2、獲取Sessions值           session_name = request.session["session_name"] 3、刪除Sessions值           del request.session["session_name"] 4、flush()      刪除當前的會話資料並刪除會話的Cookie。      這用於確保前面的會話資料不可以再次被使用者的瀏覽器訪問 5、get(key, default=None) fav_color = request.session.get('fav_color', 'red') 6、pop(key) fav_color = request.session.pop('fav_color') 7、keys() 8、items() 9、setdefault() 10 使用者session的隨機字串         request.session.session_key             # 將所有Session失效日期小於當前日期的資料刪除         request.session.clear_expired()             # 檢查 使用者session的隨機字串 在資料庫中是否         request.session.exists("session_key")             # 刪除當前使用者的所有Session資料         request.session.delete("session_key")             request.session.set_expiry(value)             * 如果value是個整數,session會在些秒數後失效。             * 如果value是個datatime或timedelta,session就會在這個時間後失效。             * 如果value是0,使用者關閉瀏覽器session就會失效。             * 如果value是None,session會依賴全域性session失效策略。 2.設定中介軟體的儲存方式 jango預設支援Session,並且預設是將Session資料儲存在資料庫中,即:django_session 表中。     a. 配置 settings.py         SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(預設)             SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串(預設)     SESSION_COOKIE_PATH = "/"                               # Session的cookie儲存的路徑(預設)     SESSION_COOKIE_DOMAIN = None                             # Session的cookie儲存的域名(預設)     SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(預設)     SESSION_COOKIE_HTTPONLY = True