1. 程式人生 > 其它 >Django框架URL與檢視部分

Django框架URL與檢視部分

技術標籤:pythondjangourl

檢視

通過檢視函式,接受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)
]