寫固定的url.html
能夠正則規則正則表達式
例: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),網站
]編碼
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 這個字符串是「原始的」 —— 字符串中任何字符都不該該轉義
path和url的區別
a. path 內部封裝好了,自動限制首尾的規則
b.url 沒有封裝,須要本身手動添加正則規則(同re_path方法).
c.url是django1.*的表達方式,django2.*的re_path方法同於url
上面的示例使用簡單的、沒有命名的正則表達式組(經過圓括號)來捕獲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
#注意year和urls中的名字是對應的
def year_demo(request,year):
#打印提交的yrear的值
print(year)
return HttpResponse("2019年")
#注意year,month和urls中的名字是對應的
def month_demo(request,year,month):
#打印提交的yrear和month的值
print(year,month)
return HttpResponse("2019年7月")
總結:
無名分組(按位置傳參)
用re_path方法,在url裏用小括號進行分組(括號裏寫上正則的規則).
注意:在視圖函數裏要寫上對應的形參,不然會報錯.
有名分組(按關鍵字傳參)
用re_path方法,在url裏用小括號進行分組(括號裏寫上正則的規則).
語法:括號裏(?P<關鍵字名稱>正則規則)
在視圖裏形參必需要跟關鍵字名稱保持一致,位置沒有關係.
1個Django 項目裏面有多個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),
]
而後app01與app02中對應的view寫相應的視圖函數。
在使用Django 項目時,一個常見的需求是得到URL 的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用於處理服務器端的導航(重定向等)。人們強烈但願不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 絕不相關的專門的URL 生成機制,由於這樣容易致使必定程度上產生過時的URL。
在須要URL 的地方,對於不一樣層級,Django 提供不一樣的工具用於URL 反查:
在模板中:使用url 模板標籤。
在Python 代碼中:使用from django.urls import reverse()函數
好處: 當你url發生改變,動態反向解析出對應的url.便於開發和維護.
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.html中body內容爲:
<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>
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">
命名空間(英語:Namespace)是表示標識符的可見範圍。一個標識符可在多個命名空間中定義,它在不一樣命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何標識符,它們不會與任何已有的標識符發生衝突,由於已有的定義都處於其它命名空間中。因爲name沒有做用域,Django在反解URL時,會在項目全局順序搜索,當查找到第一個name指定URL時,當即返回。
咱們在開發項目時,會常用name屬性反解出URL,當不當心在不一樣的app的urls中定義相同的name時,可能會致使URL反解錯誤,爲了不這種事情發生,引入了命名空間。
path('app01/', include(("app01.urls", "app01"))),
path('app02/', include(("app02.urls", "app02"))),
在conf.py源碼的44行
namespace = namespace or app_name
表示,若是用命名空間使用命名空間的名字,若是沒有使用app_name的名字
須要修改內容以下:
1.在視圖中
reverse('app01:login')
2. 在模板中
<form action="{% url 'app01:login' %}" method="post">
例:
project的urls.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>