django中的路由系統
django中的路由系統
一、路由配置系統(URLconf)
URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL呼叫的檢視函式之間的對映表;你就是以這種方式告訴Django,對於一個URL應該呼叫哪一段程式碼。
urlpatterns = [
url(正則表示式, views檢視函式,引數,別名),
]
引數說明:
一個正則表示式字串
一個可呼叫物件,通常為一個檢視函式或一個指定檢視函式路徑的字串
可選的要傳遞給檢視函式的預設引數(字典形式)
一個可選的name引數
url中的正則字串引數
1、簡單配置
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
''' NOTE: 一旦匹配成功則不再繼續 若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。 不需要新增一個前導的反斜槓,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。 每個正則表示式前面的'r' 是可選的但是建議加上。 一些請求的例子: /articles/2005/3/ 不匹配任何URL 模式,因為列表中的第三個模式要求月份應該是兩個數字。 /articles/2003/ 將匹配列表中的第一個模式不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。 /articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將呼叫函式 views.month_archive(request, '2005', '03')。 '''
2、有名分組(named group)
上面的示例使用簡單的、沒有命名的正則表示式組(通過圓括號)來捕獲URL 中的值並以位置 引數傳遞給檢視。在更高階的用法中,可以使用命名的正則表示式組來捕獲URL 中的值並以關鍵字 引數傳遞給檢視。
在Python 正則表示式中,命名正則表示式組的語法是(?P<name>pattern)
,其中name
是組的名稱,pattern
是要匹配的模式。
下面是以上URLconf 使用命名組的重寫:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
這個實現與前面的示例完全相同,只有一個細微的差別:捕獲的值作為關鍵字引數而不是位置引數傳遞給檢視函式。例如:
/articles/2005/03/
請求將呼叫views.month_archive(request, year='2005', month='03')函式
/articles/2003/03/03/
請求將呼叫函式views.article_detail(request, year='2003', month='03', day='03')。
在實際應用中,這意味你的URLconf 會更加明晰且不容易產生引數順序問題的錯誤 —— 你可以在你的檢視函式定義中重新安排引數的順序。當然,這些好處是以簡潔為代價;有些開發人員認為命名組語法醜陋而繁瑣。
3、 URLconf 在什麼上查詢
URLconf 在請求的URL 上查詢,將它當做一個普通的Python 字串。不包括GET和POST引數以及域名。
例如,http://www.example.com/myapp/ 請求中,URLconf 將查詢myapp/
。
在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查詢myapp/
。
URLconf 不檢查請求的方法。換句話講,所有的請求方法 —— 同一個URL的POST
、GET
、HEAD
等等 —— 都將路由到相同的函式。
4、 捕獲的引數永遠是字串
每個捕獲的引數都作為一個普通的Python 字串傳遞給檢視,無論正則表示式使用的是什麼匹配方式。例如,下面這行URLconf 中:
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
views.year_archive()
的year
引數將是一個字串
5、 指定檢視引數的預設值
有一個方便的小技巧是指定檢視引數的預設值。 下面是一個URLconf 和檢視的示例:
# URLconf
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]
# View (in blog/views.py)
def page(request, num="1"):
...
在上面的例子中,兩個URL模式指向同一個檢視views.page
—— 但是第一個模式不會從URL 中捕獲任何值。如果第一個模式匹配,page()
函式將使用num
引數的預設值"1"。如果第二個模式匹配,page()
將使用正則表示式捕獲的num
值。
6、 Including other URLconfs
包含其他的路由
#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones.
#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:
from django.conf.urls import include, url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')),
]
二、傳遞額外的選項給檢視函式
URLconfs 具有一個鉤子,讓你傳遞一個Python 字典作為額外的引數傳遞給檢視函式。
django.conf.urls.url()
函式可以接收一個可選的第三個引數,它是一個字典,表示想要傳遞給檢視函式的額外關鍵字引數。
例如:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]
在這個例子中,對於/blog/2005/
請求,Django 將呼叫views.year_archive(request, year='2005', foo='bar')
。
這個技術在Syndication 框架中使用,來傳遞元資料和選項給檢視。
三、name引數
'''
# 路由
urlpatterns = [
url(r'^index',views.index,name='INDEX'),
]
###################
# 檢視
def index(req):
if req.method=='POST':
username=req.POST.get('username')
password=req.POST.get('password')
if username=='alex' and password=='123':
return HttpResponse("登陸成功")
return render(req,'index.html')
#####################
# 模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# <form action="/index/" method="post">#}
<form action="{% url 'INDEX' %}" method="post">
使用者名稱:<input type="text" name="username">
密碼:<input type="password" name="password">
<input type="submit" value="submit">
</form>
</body>
</html>
#######################
'''