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'), ]
注意:正則表達式
^articles
而不是^/articles
。開啓URL訪問地址後面不爲「/」跳轉至帶有「/」路徑的配置項:django
APPEND_SLASH=True Django settings.py配置文件中默認沒有 APPEND_SLASH 這個參數,但 Django 默認這個參數爲 APPEND_SLASH = True。 其做用就是自動在網址結尾加'/'
按位置傳參瀏覽器
分組後,將分好組的數據當作位置傳參到視圖函數,因此視圖函數須要定義形參服務器
示例: 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)
在使用Django 項目時,一個常見的需求是得到URL 的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用於處理服務器端的導航(重定向等)。人們強烈但願不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 絕不相關的專門的URL 生成機制,由於這樣容易致使必定程度上產生過時的URL。
在須要URL的地方,對於不一樣層級,Django提供不一樣的工具用於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))
命名空間(英語: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')