08 url之路由控制

編輯本博客html

yuan先生博客python

簡單路由配置

urls.py 配置路由django

正則路由匹配:瀏覽器

相似re正則,無需像path那樣路徑必須同樣。匹配從上至下,能匹配到即刻返回,不會再朝下匹配app

from django.urls import path,re_path
  • ^以什麼開頭
  • $以什麼結尾
from django.urls import re_path
from app01 import views
urlpatterns = [
    re_path(r'^special_case_2003/$',views.special_case_2003)
]
View Code
  • ([0-9]){4},只要在url匹配中進行分組後,會自動將分組內容傳遞給位置參數,因此處理函數必須有相應位置參數
    re_path(r'^special_case/([0-9]{4})/$',views.special_case_2003)
        #可匹配special_case/2001/,special_case/2002/,special_case/2003/,special_case/2004/等相似url
    View Code
    def year_archive(request,year):
        return HttpResponse("year:%s" % year)
    View Code

  • 在正則中有多個分組,則需多個位置參數
    re_path(r'^archive/([0-9]{4})/([0-9]{2})$',views.math_archive),
    View Code
    def math_archive(request,year,math):
        return HttpResponse("year:%s年%s月" % (year,math))
    View Code

注意:ide

  • 若要從url中捕獲一個值,只須要在周圍放置一對圓括號
  • 不須要添加一個前置反斜槓,由於每一個url都有
  • 每一個正則前面的'r'可選,但建議放置,告訴python爲原始字符,任何字符都無需轉義

HttpResponse函數

本身構造響應體post

from django.shortcuts import render,HttpResponse
def special_case_2003(request):
    #直接給瀏覽器返回一個h1標籤
    return HttpResponse("<h1>special_case_2003</h1>")
View Code 

有名分組

即對url正則中捕獲的參數進行命名,避免順序混亂。即經過關鍵字參數進行傳參。ui

?P<m>
re_path(r'^archive/(?P<y>[0-9]{4})/(?P<m>[0-9]{2})$',views.math_archive),

在視圖函數中接收參數時,位置顛倒無所謂url

def math_archive(request,m,y):
    return HttpResponse("year:%s年%s月" % (y,m))
View Code

路由分發

將各個app的路由分開定義,,經過include方法進行指定,由全局路由進行分發,分發到應用上

在應用下面新建一個urls.py文件

在本urls文件中,單獨定義路由

from django.urls import re_path,path
from app01 import views
urlpatterns = [
    path('timer/', views.timer),
    re_path(r'^special_case_2003/$',views.special_case_2003),
    re_path(r'^archive/([0-9]{4})/$',views.year_archive),
    re_path(r'^archive/(?P<y>[0-9]{4})/(?P<m>[0-9]{2})$',views.math_archive),
]
View Code

在全局urls文件中,經過include方法對其接入

from django.urls import path,re_path,include
urlpatterns = [
    #分發路由
    re_path(r"app01/",include("app01.urls"))
]
View Code

瀏覽器中訪問新的路徑

路由反向解析

  • request.GET獲取全部get方法的數據
  • request.POST獲取全部post方法的數據

 在urls中定義path的時候給取別名

path('logins/', views.login,name="login")

在html模板中經過固定方式獲取動態的url地址,別名相同便可

<form action="{% url 'login' %}" method="post">
    <input type="text" name="name" placeholder="用戶名">
    <input type="password" name="pwd" placeholder="密碼">
    <input type="submit" value="登陸">
</form>
View Code

render的時候會自動查找同名的url,避免path中路徑修改後須要到html中同步修改

視圖函數中使用反向解析

路由中添加名稱空間後,在url中使用反向解析必定要加上名稱空間前綴,冒號分割

與訪問的路由無關係

首先導入反向解析模塊

from django.urls import reverse

給urlpath起別名

re_path(r'^special_case_2003/$',views.special_case_2003,name="s_c_2003")

在視圖函數中便可使用

def special_case_2003(request):
    url=reverse("s_c_2003")
    print(url)

反向解析帶組的域名,須要添加相應參數

url中添加了分組

re_path(r'^archive/([0-9]{4})/$',views.year_archive,name="y")

視圖函數中訪問會出現報錯

def special_case_2003(request):
    url2=reverse("y")
    print(url2)

此時須要給符合正則的參數

def special_case_2003(request):
    url1=reverse("s_c_2003")
    print(url1)
    url2=reverse("y",args=(2008,))
    print(url2)
    return HttpResponse("<h1>special_case_2003</h1>")
View Code

路由之名稱空間

路由中添加名稱空間後,在url中使用反向解析必定要加上名稱空間前綴,冒號分割

不一樣的app中可能存在同名的路徑別名,這樣就會出現衝突

如,在app01中定義一個name='index'的別名

re_path("index/",views.index,name="index")

如,在app02中一樣定義一個name='index'的別名

re_path("index/",views.index,name="index")

此時,在視圖函數中反向解析則會出問題,在不一樣的應用中反向解析出來的域名是同樣的

咱們在全局include應用urls時,添加名稱空間,元祖的方式傳入

re_path(r"^app01/",include(("app01.urls",'app01'))),
re_path(r"^app02/",include(("app02.urls",'app02')))

在視圖函數中反向解析的時候,添加名稱空間和別名便可解決

app01中

def index(request):
    url=reverse('app01:index')
    print(url)
    return HttpResponse("app01 index")

app02中

def index(request):
    url = reverse('app02:index')
    print(url)
    return HttpResponse("<h2>app02 index</h2>")

在不一樣的應用中反向解析同名路徑別名

路由控制path方法 

在url中匹配成功的值都是字符串,容易致使數據類型錯誤

def math_archive(request,m,y):
    print(type(y),type(m))

相同的規則可能在不一樣的url中出現,修改起來比較麻煩

Django2.0中出現path函數,可解決上面問題

  • 使用尖括號從url中捕獲值
  • 捕獲值中能夠包含一個類型轉換器
  • 無需添加前置反斜槓

支持的轉換器

  • str:匹配除了路徑分隔符(/)之外的全部非空字符,默認形式
  • int:匹配整型
  • slug:匹配字面,數字,下劃線組成的字符串
  • uuid:匹配格式化的uuid如ddddd-33333-fffffff
  • path:匹配非空字符串,包含路徑分隔符
path("index2/<int:year>"),

在視圖函數中查看year參數類型

def index(request,year):
    print(type(year))
    return HttpResponse("app01 index")

int類型

自定義轉換器

class MonConvert:
    regex="[0-9]{2}"
    def to_python(self,value):
        return int(value)
    def to_rul(self,value):
        return '%04d' % value

在urls中註冊自定義轉換器

from django.urls import register_converter
register_converter(MonConvert,'mm')

在視圖函數中打印類型

def path_month(request,month):
    print(type(month))
    return HttpResponse("app01.path_month")
View Code

相關文章
相關標籤/搜索