編輯本博客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) ]
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
def year_archive(request,year): return HttpResponse("year:%s" % year)
re_path(r'^archive/([0-9]{4})/([0-9]{2})$',views.math_archive),
def math_archive(request,year,math): return HttpResponse("year:%s年%s月" % (year,math))
注意:ide
HttpResponse函數
本身構造響應體post
from django.shortcuts import render,HttpResponse
def special_case_2003(request): #直接給瀏覽器返回一個h1標籤 return HttpResponse("<h1>special_case_2003</h1>")
即對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))
將各個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), ]
在全局urls文件中,經過include方法對其接入
from django.urls import path,re_path,include urlpatterns = [ #分發路由 re_path(r"app01/",include("app01.urls")) ]
瀏覽器中訪問新的路徑
在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>
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>")
路由中添加名稱空間後,在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>")
在不一樣的應用中反向解析同名路徑別名
在url中匹配成功的值都是字符串,容易致使數據類型錯誤
def math_archive(request,m,y): print(type(y),type(m))
相同的規則可能在不一樣的url中出現,修改起來比較麻煩
Django2.0中出現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")