天天看點

Django V部分總結一一,URL配置(URLconf)二,Django Views(視圖函數)

V部分就是Django Views(視圖函數)

其下主要包括兩部分:

一,URL配置(URLconf)

是Django所支撐網站的目錄

本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對于這個URL調用這段代碼,對于那個URL調用那段代碼。

配置部分是在Django項目下的

urls.py

下的

urlpatterns = [ ]

部分

具體的格式Djange1.x版本和2.x版本略有不同,這裡以2.x

版本為例:

首先

from django.urls import path

這裡url精确查找方式,用法:

path('url',views.視圖函數)

放到

urlpatterns

一般視圖函數都放在app中,是以還要

from app名稱 import views
           

還有一個模糊查找:

from django.urls import re_path
           

相當于1.x版本裡的url

相比于精确查找就是在url部分加入了正則,使用了模糊查找

這裡插一句,URL查找是從上到下查找,一旦找到就執行對應views函數,是以在使用模糊查詢re_path時要特别注意邏輯順序

以上兩者path(),re-path())都可以加一個那麼屬性,給url起一個别名,前端直接用别名

作用是前端大量調用這個url是,當後端url名稱修改時,前端無須改動,提高可維護性

此外,還有一個

url分發的概念

意思是說在一個Django項目中,一般有多個app

要把url查找分發到各個app中

首先在app下建立一個urls.py檔案,存放屬于自己的url

形式和在Djiango項目檔案夾urls.py中的一樣

要想讓url分發生效,要在Djiango項目檔案夾urls.py中配置

from django.urls import include   #開啟url分發功能
           

然後在urlpatterns 添加

path('app名稱/', include('app名稱.urls'))

之後這種 ip位址:端口号/app/url 就會到對應app下的urls.py查找執行對應的views函數

二,Django Views(視圖函數)

也就是根據url來決定要執行的視圖函數部分

先看視圖函數的基本結構:

def "函數名"(request,*args,**kwargs):
    "函數體"
    return "傳回值"
           

先看參數部分:

必須要有的一個就是request(其它名字也行),裡面包含了用戶端的所有請求資訊

form表單裡的請求資訊都是用字典的形式存儲在request.請求方式中(POST or GET)中

*args 和 **kwargs可以改成通過url有名分組的方式來定的形參名

eg:

re_path(r'article/(?P<year>\d{4})/(?P<month>\d{2})',views.article_year_month)

,

#有名分組正則,執行函數中隻能用給定好了的形參名字

ps:第一部分說到的都是無名分組

再看傳回值部分:

有下面幾種方式:

render , HttpResponse , render_to_response , redirect

都需要導入:

from django.shortcuts import render, HttpResponse,render_to_response,redirect
           

1.HttpResponse:

基本方式,就和httprequest一樣,是http請求中兩個核心對象:

http請求:HttpRequest對象

    http響應:HttpResponse對象
           

後面幾種響應方式最後都是交給了HttpPesponse(源碼可知),但不常用,主要用render

形式

return HttpResponse(“字元串”)

字元串中可以是html代碼和字元串操作,缺點很明顯,耦合性太高,不常用,不細講

2.render(最最常用)

形式:

return render(request,"html檔案名",context對象)
           

context對象是可選參數

插:1.render會把第二個參數(html檔案的字元串形式)執行個體化為Template對象,把第三個參數執行個體化為Context對象,然後Template類對象調用render方法,傳入Context執行個體化對象做參數,得到一個結果

2render把處理好的結果會交給Httpresponse傳回給用戶端,是以要有一個request參數

3.render_to_response

相比較render 就是不用傳request對象,當然後面都是交給響應對象HttpResponse處理

不推薦,因為可能有會bug

4.redirect

形式:return redirect(“url路徑”)

我的了解是用戶端接收到服務端響應的return redirect(“url路徑”)後,會按照這個url對服務端再發送請求,是以用戶端url位址會變成上面的url路徑

另補充一點:要重新通信上一次的對象時,可省略ip位址和端口,這是Django自帶的一個同源機制