Django 學習 之路由層(URL)

 路由層(URL)

1.路由層簡單配置

(1)path方法

寫固定的url.html

(2)re_path方法

能夠正則規則正則表達式

例:django

urlpatterns = [服務器

    path('admin/', admin.site.urls),app

    path('articles/2003/', views.special_case_2003),函數

    re_path(r'^articles/([0-9]{4})/$', views.year_archive),工具

    re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),post

    re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),網站

]編碼

(3)url方法及與path的區別

URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要爲該URL調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於客戶端發來的某個URL調用哪一段邏輯代碼對應執行。

urlpatterns = [

         url(正則表達式, views視圖函數,參數,別名),

]

參數說明:

    一個正則表達式字符串

    一個可調用對象,一般爲一個視圖函數或一個指定視圖函數路徑的字符串

    可選的要傳遞給視圖函數的默認參數(字典形式)

    一個可選的name參數

例:

urlpatterns = [

    url(r'^admin/$', admin.site.urls),

    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),

]

注意:

若要從URL 中捕獲一個值,只須要在它周圍放置一對圓括號。

不須要添加一個前導的反斜槓,由於每一個URL 都有。例如,應該是^articles 而不是 ^/articles

每一個正則表達式前面的'r' 是可選的可是建議加上。它告訴Python 這個字符串是「原始的」 —— 字符串中任何字符都不該該轉義

 

pathurl的區別

a. path 內部封裝好了,自動限制首尾的規則

b.url   沒有封裝,須要本身手動添加正則規則(re_path方法).

c.urldjango1.*的表達方式,django2.*re_path方法同於url

2.無名分組與有名分組

上面的示例使用簡單的、沒有命名的正則表達式組(經過圓括號)來捕獲URL 中的值並以位置 參數傳遞給視圖。在更高級的用法中,可使用命名的正則表達式組來捕獲URL

中的值並以關鍵字 參數傳遞給視圖。

Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern),其中name 是組的名稱,pattern 是要匹配的模式。

下面是有名分組的例子:

urls.py

from django.contrib import admin

from django.urls import path,re_path

from app01 import views

 

urlpatterns = [

    path('admin/', admin.site.urls),

    # 有名分組例子

    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_demo),

    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_demo),

 

]

 

相應的是views.py內容:

from django.shortcuts import render,HttpResponse,redirect

#注意yearurls中的名字是對應的

def year_demo(request,year):

#打印提交的yrear的值

    print(year)

    return HttpResponse("2019")

#注意year,monthurls中的名字是對應的

def month_demo(request,year,month):

#打印提交的yrearmonth的值

    print(year,month)

    return HttpResponse("20197")

 

總結:

無名分組(按位置傳參)

   re_path方法,url裏用小括號進行分組(括號裏寫上正則的規則).

   注意:在視圖函數裏要寫上對應的形參,不然會報錯.

有名分組(按關鍵字傳參)

   re_path方法,url裏用小括號進行分組(括號裏寫上正則的規則).

   語法:括號裏(?P<關鍵字名稱>正則規則)

   在視圖裏形參必需要跟關鍵字名稱保持一致,位置沒有關係.

 

3.路由分發系統

1Django 項目裏面有多個APP目錄你們共有一個 url容易形成混淆,因而路由分發讓每一個APP的擁有了本身單獨的url。以下圖:

當一個url請求過來以後

(1)先到項目主目錄下的urls內。

(2)由這個url作處理分發給其餘app內的urls

 

一級路由:主目錄urls內引入include

from django.contrib import admin

from django.urls import path,re_path,include

 

urlpatterns = [

path('admin/', admin.site.urls),

# 指定分發的app目錄名稱

    path('app01/',include("app01.urls")),

    path('app02/',include("app02.urls"))

]

二級路由:只查找本地urls內的路徑

app01中的urls:

from django.urls import path,re_path

from app01 import views

 

urlpatterns = [

    path('test/',views.test),

 

]

app02中的urls:

from django.urls import path,re_path

from app02 import views

 

urlpatterns = [

    path('articles/',views.articles),

 

]

而後app01app02中對應的view寫相應的視圖函數。

4.反向解析

在使用Django 項目時,一個常見的需求是得到URL 的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用於處理服務器端的導航(重定向等)。人們強烈但願不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 絕不相關的專門的URL 生成機制,由於這樣容易致使必定程度上產生過時的URL

在須要URL 的地方,對於不一樣層級,Django 提供不一樣的工具用於URL 反查:

在模板中:使用url 模板標籤。

Python 代碼中:使用from django.urls import reverse()函數

好處: 當你url發生改變,動態反向解析出對應的url.便於開發和維護.

(1)固定寫法例子

app01上的urls.py加:

from django.urls import path, re_path

from app01 import views

 

urlpatterns = [

    path('login/', views.login),

    path('index/', views.index),

 

]

app01上的view.py加:

def login(request):

    if request.method == "POST":

        username = request.POST.get("username")

        pwd = request.POST.get("pwd")

        if username == "hsz" and pwd == "123":

            return redirect("/app01/index/")

 

    return render(request, "login.html")

 

def index(request):

return HttpResponse("<h2>Is Index</h2>")

login.htmlbody內容爲:

<body>

<h3>用戶登陸</h3>

{#    固定寫法,不靈活#}

<form action="/app01/login/" method="post">

    <p>用戶名: <input type="text" name="username"></p>

    <p>密碼 : <input type="password" name="pwd"></p>

    <input type="submit">

</form>

</body>

(2)反向解析解決方法

1.app01上的urls.py中定義name

path('login/', views.login),

改成:

path('login1/', views.login, name='login'),

 

2.在視圖中反向解析

 from django.urls import reverse

 reverse("login")

    

無名分組

re_path(r'^login1/([0-9]{2})/$', views.login, name="login"),

 #須要加一個形參

reverse("login", args=("12",))

      

有名分組

re_path(r'^login1/(?P<month>[0-9]{2})/$', views.login, name="login"),

#須要加一個名爲month的形參與之對應

reverse("login", kwargs={"month": "12"})

 

3.在模板中使用反向解析

path方法(url)

<form action="{% url 'login' %}" method="post">

          

re_path(無名分組)     按照位置傳參

<form action="{% url 'login' 12 %}" method="post">

          

re_path(有名分組)     按照名字傳參

<form action="{% url 'login' month=12 %}" method="post">

5. 名稱空間

命名空間(英語:Namespace)是表示標識符的可見範圍。一個標識符可在多個命名空間中定義,它在不一樣命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何標識符,它們不會與任何已有的標識符發生衝突,由於已有的定義都處於其它命名空間中。因爲name沒有做用域,Django在反解URL時,會在項目全局順序搜索,當查找到第一個name指定URL時,當即返回。

咱們在開發項目時,會常用name屬性反解出URL,當不當心在不一樣的appurls中定義相同的name時,可能會致使URL反解錯誤,爲了不這種事情發生,引入了命名空間。

(1)定義名稱空間

path('app01/', include(("app01.urls", "app01"))),

path('app02/', include(("app02.urls", "app02"))),

    

conf.py源碼的44

namespace = namespace or app_name

表示,若是用命名空間使用命名空間的名字,若是沒有使用app_name的名字

(2)使用名稱空間

須要修改內容以下:

1.在視圖中

reverse('app01:login')

2. 在模板中

<form action="{% url 'app01:login' %}" method="post">

例:

projecturls.py

urlpatterns = [

    re_path(r'^admin/', admin.site.urls),

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

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

]

app01.urls

urlpatterns = [

    re_path(r'^index/', index,name="index"),

]

app02.urls

 

urlpatterns = [

    re_path(r'^index/', index,name="index"),

]

 

app01.views

from django.core.urlresolvers import reverse

 

def index(request):

    return  HttpResponse(reverse("app01:index"))

 

app02.views

from django.core.urlresolvers import reverse

 

def index(request):

 

    return  HttpResponse(reverse("app02:index"))

在模板中也是同理

<form action="{% url 'app01:Login' %}" method="post">

    <p>用戶名:<input type="text" name="user"></p>

    <p>密碼:<input type="password" name="pwd"></p>

    <input type="submit">

</form>

相關文章
相關標籤/搜索