1. 程式人生 > >django中的路由系統

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的POSTGETHEAD等等 —— 都將路由到相同的函式。

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>

#######################

'''