Django入門(四)

1、URL路由的簡單配置

一、URL路由基礎:​

  URL是Web服務的入口,用戶經過瀏覽器發送過來的如何請求,都是發送到一個知道的URL地址,而後被響應。
​  URL路由在Django項目中的體現就是urls.py文件,這個文件能夠是多個的,但絕對不會再同一目錄下.實際上Django提倡項目有個根urls.py,各個app下分別有本身的一個urls.py,既集中又分開,是一種解耦的模式。html

  在django項目中編寫路由就是向外暴露咱們接收哪些URL的請求,除此以外任何的URL都不會被處理,URL路由就是web服務對外暴露的APIweb

二、路由簡單配置:

urlpatterns = [
    #url(正則表達式,視圖函數,參數,別名)
    url(r'^index/$', index,name='index'),
]

注意:正則表達式

  • 若要從URL中捕獲一個值,只須要在它周圍放置一對圓括號。
  • 不須要添加前導的反斜槓,由於每一個URL都有。 例如,應該是^articles而不是^/articles
  • 每一個正則表達式前面的'r'是可選的可是建議加上。它告訴Python這個字符串是「原始的」 —— 字符串中任何字符都不該該轉義。
  • urlpatterns列表中的元素按照書寫順序從上往下逐行匹配正則表達式,一旦匹配成功則再也不繼續

開啓URL訪問地址後面不爲「/」跳轉至帶有「/」路徑的配置項:django

APPEND_SLASH=True
Django settings.py配置文件中默認沒有 APPEND_SLASH 這個參數,但 Django 默認這個參數爲 APPEND_SLASH = True。 其做用就是自動在網址結尾加'/'

2、有名分組和無名分組

一、無名分組

  按位置傳參瀏覽器

  分組後,將分好組的數據當作位置傳參到視圖函數,因此視圖函數須要定義形參服務器

  示例: app

url:(r'^articles/([0-9]{4})/([0-9]{2})/$', views.article_detail)

  視圖函數函數

def article_detail(request,*args)

二、有名分組

有名分組的語法是: (?P<name>pattren)  ,其中name是組的名字,pattren工具

  按關鍵字傳參編碼

  分組後,會把分組出來的數據當作關鍵字參數傳到視圖函數,因此視圖函數須要定義形參,形參名字和分組的名字相對應,與順序無關

  示例:

url:(r'^articles/(?P<year>[0-9]{4})/(?P<mouth>[0-9]{2})/$', views.article_detail),

  函數視圖

def article_detail(request,mouth,year)

注:有名分組和無名分組最好不要混用!

3、反向解析

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

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

  1. 在模板語言中:使用URL模板標籤
  2. 在Python代碼中:使用reverse() 函數
  3. 在更高層的處理Django模型實例相關的代碼中:使用get_absolute_url()方法

案例:urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test,name='year_month'),
]

HTML中:

<a href="{% url 'year_month' 1001 12 %}">點擊下載2333</a>

在視圖函數中:

from django.shortcuts import HttpResponse,reverse

def test(request,year ,month):
    print(year,month)
    url = reverse('year_month',args=(1000,20,))
    print(url)
    return HttpResponse('2018-12')

總結:

1.在html中使用{% url '別名' 參數 參數 %}  參數之間用空格分隔
2.在視圖函數中:
    2.1 url=reverse('year_month')
    2.2 url=reverse('year_month',args=(1000,20))

4、名稱空間

​ 命名空間(英語:Namespace)是表示標識符的可見範圍。一個標識符可在多個命名空間中定義,它在不一樣命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何標識符,它們不會與任何已有的標識符發生衝突,由於已有的定義都處於其它命名空間中。

因爲name沒有做用域,Django在反解URL時,會在項目全局搜索,當查找到第一個name指定URL時,當即返回。因此當兩個不一樣app下的URL的name重複時,會產生衝突。

爲了解決這一問題,有兩種解決方法:

#方法一,在分發路由時,分配名稱空間
url(r'^app01/', include('app01.urls',spacename='app01')),
#使用
app01:路由別名

    
#方法二,在設置路由別名時,加上前綴,不要重複
url(r'^delauthor/(\d+)(.html)$',delauthor,name='app01_delauthor')
url(r'^delauthor/(\d+)(.html)$',delauthor,name='app02_delauthor')
相關文章
相關標籤/搜索