Django框架URL與檢視部分
檢視
通過檢視函式,接受web請求並且返回web響應,這個響應可以是HTML頁面、錯誤頁面、重定向頁面、XML文件或者是一張圖片。
不管檢視本身包含什麼邏輯,都要返回響應。
在python中,一般放在view.py檔案中,每個檢視函式都要返回一個HttpResponse物件,物件中包含生成的響應。
#book/view.py
from dijango.http import HttpResponse
def book(request):
return HttpResponse("返回一個頁面")
#urls.py
from book import views
urlpatterns = [
path("book",views.book) #定義路由資訊
]
URL對映
在檢視完成之後,需要與URL進行對映,使用者可以在瀏覽器中輸入相應的url可以進行請求到這個檢視函式。
在urls.py檔案中有一個urlpatterns變數,以後django就會從這個變數中讀取所有的匹配規則。匹配規則需要使用django.urls.path函式進行包裹,這個函式會根據傳入的引數返回URLPattern或者是URLResolver的物件。
from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path("admin/",admin.site.urls),
path("book/",views.book)
]
URL中新增引數
在有些情況中,url中還包含了一些其他樣式的引數。
如檢視圖書的頁碼:
#urls.py
from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book/<book_id>/',views.book_detail)
#views.py
def book_detail(request,book_id):
test = "書籍的id是:%s" % book_id
return HttpResponse(text)
通過查詢字串的形式:
#views.py
def book_detail(request):
book_id = request.GET.get("id")
text = "書籍的id是:%s" % book_id
return HttpResponse(text)
URL模組化
URL中包含另外一個urls模組:
在我們的專案中,不可能會只有一個app檔案,如果把所有的app的views中的檢視都放在urls.py中進行對映,這樣會讓程式碼比較亂不好管理。我們可以使用include
函式,可以在app內部包含自己的url匹配,而在專案中的urls.py中在統一包含這個app的urls。
# django_first/urls.py檔案:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include("book.urls")) # include("檔名.urls")
]
urls.py檔案把所有的和book這個app相關的url都移動到app/urls.py中,django_first/urls.py中,通過include函式包含book.urls,以後在請求book相關的url的時候都需要加一個book的字首,相當於是路由的分發 如/book/xxxx來訪問
Django內建轉換器
from django.urls import converters
uuid
uuid是128位的全域性唯一識別符號(univeral unique identifier),通常用32位的一個字串的形式來表現。有時也稱guid(global unique identifier)。python中自帶了uuid模組來進行uuid的生成和管理工作。(具體從哪個版本開始有的不清楚。。)
python中的uuid模組基於資訊如MAC地址、時間戳、名稱空間、隨機數、偽隨機數來uuid。具體方法有如下幾個:
- uuid.uuid1() 基於MAC地址,時間戳,隨機數來生成唯一的uuid,可以保證全球範圍內的唯一性。
- (uuid.uuid2() 演算法與uuid1相同,不同的是把時間戳的前4位置換為POSIX的UID。不過需要注意的是python中沒有基於DCE的演算法,所以python的uuid模組中沒有uuid2這個方法。
- uuid.uuid3(namespace,name) 通過計算一個名稱空間和名字的md5雜湊值來給出一個uuid,所以可以保證名稱空間中的不同名字具有不同的uuid,但是相同的名字就是相同的uuid了。
- 【感謝評論區大佬指出】namespace並不是一個自己手動指定的字串或其他量,而是在uuid模組中本身給出的一些值。比如uuid.NAMESPACE_DNS,uuid.NAMESPACE_OID,uuid.NAMESPACE_OID這些值。這些值本身也是UUID物件,根據一定的規則計算得出。
- uuid.uuid4() 通過偽隨機數得到uuid,是有一定概率重複的
- uuid.uuid5(namespace,name) 和uuid3基本相同,只不過採用的雜湊演算法是sha1
一般而言,在對uuid的需求不是很複雜的時候,uuid1方法就已經夠用了,使用方法如下:
#coding=utf-8
import uuid
name = 'test_name'
# namespace = 'test_namespace'
namespace = uuid.NAMESPACE_URL
print(uuid.uuid1())
print(uuid.uuid3(namespace,name))
print(uuid.uuid4())
print(uuid.uuid5(namespace,name))
url命名與反轉
• 1.為什麼需要URL命名
因為在專案開發的過程中URL地址可能經常變動,如果寫死會經常去修改
• 2.如何給一個URL指定名稱
path("",views.index,name=“index”)
• 3.應用名稱空間
在多個app之間可能產生同名的URL,這時候為了避免這種情況,可以使用名稱空間來加以區分。在urls.py中新增app_name即可。
應用名稱空間和例項名稱空間
一個app,可以建立多個例項。可以使用多個URL對映同一個App。在做反轉的時候,如果使用應用名稱空間,就會發生混淆,為了避免這個問題,可以使用例項名稱空間,例項名稱空間使用,namespace=‘例項名稱空間’
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('cms1/', include("cms.urls",namespace='cms1')),
path('cms2/', include("cms.urls",namespace='cms2')), #例項名稱空間
path('front/', include("front.urls")),
]
URL反轉傳遞引數
如果這個url中需要傳遞引數,那麼可以通過kwargs來傳遞引數。
reverse("book:detail",kwargs={"book_id":1})
因為django中的reverse反轉url的時候不區分GET請求和POST請求,因此不能在反轉的時候新增查詢字串的引數。如果想要新增查詢字串的引數,只能手動的新增。
login_url = reverse("front:singin") + "?name=jr"
return redirect(login_url)
指定預設的引數
from django.http import HttpResponse
# Create your views here.
#以列表的形式儲存資料
article_lists = ["a","b","c"]
def article(request):
return HttpResponse(article_lists[0])
def page(request,page_id=0):
return HttpResponse(article_lists[page_id])
from django.urls import re_path,path
from . import views
urlpatterns = [
path("",views.article),
path("page/",views.page),
path("page/<int:page_id>",views.page),
]
re_path函式
有時候我們在寫url匹配的時候,想要寫使用正則表示式來實現一些複雜的需求,可以使用re_path
函式來實現,第一個引數可以為一個正則表示式
#article/urls.py
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r"^$",views.article),
re_path(r"^article_list/(?P<year>\d{4})/",views.article_list)
re_path(r"^article_list/(?P<mouth>\d{2})/",views.article_mouth)
]