日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

路由系统(urls.py)

發布時間:2025/3/18 windows 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 路由系统(urls.py) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ?路由系統(urls.py)? ?

正則表達式匹配

urls.py

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), ] Django 2.0版本中的路由系統已經替換成下面的寫法 from django.urls import path urlpatterns = [path('articles/2003/', views.special_case_2003),path('articles/<int:year>/', views.year_archive),path('articles/<int:year>/<int:month>/', views.month_archive),path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]

1.基本格式:

from django.conf.urls import url urlpatterns=[ url(正則表達式, views視圖函數,參數,別名), ] url(r'^delete_book/$', views.delete_book),#嚴謹起見,加結束符$ 正則表達式:一個正則表達式字符串
views視圖函數:一個可調用對象
參數:可選的要傳遞給視圖函數的默認參數(字典形式)
別名:一個可選的name參數
注意點:
1.元素按照書寫順序從上往下逐一匹配正則表達式,一旦匹配成功則不再繼續。
/delete_book/?id=5在urls中匹配到delete_book就執行函數,不再匹配?id=5
2.若要從URL中捕獲一個值,只需要在它周圍放置一對圓括號(分組匹配)
url(r'^delete_book/(\d)$', views.delete_book)
在頁面請求時,必須是delete_book/num 后面必須有個數字,否則匹配不上相當于為后端穿個參數
3.不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。
4.每個正則表達式前面的'r' 是可選的但是建議加上

URL正向解析

分組匹配()

相當于給視圖函數傳遞位置參數

1.分組匹配:會捕獲括號里的內容當做參數傳給執行函數

url(r'^delete_book/([0-9]{4})/([0-9]{2})/$', views.delete_book),def add_book(request):pass只在網頁上輸入/delete_book/會出錯,原因是給函數傳了三個參數,而函數只接收了一個add_book(request,arg1,arg2):pass

2.使用分組匹配完成書籍的刪除

1.url(r'^delete_book/([0-9]+)/$',views.delete_book) 2.def delete_book(request,del_id):if del_id:del_obj=models.Book.objects.get(id=del_id)del_obj.delete()return redirect("/book_list/")else:return HttpResponse("要刪除的書籍不存在")

3.HTML中

<a class="btn btn-danger" href="/delete_book/{{ book.id }}">刪除</a>
在urls中查找的是/delete_book/num/,查到就執行相應函數,{{ book.id }}作為參數

分組命名匹配

在Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern),其中name 是組的名稱,pattern 是要匹配的模式。
相當于給視圖函數傳遞關鍵字參數.分組匹配和分組命名匹配不能混合使用
url(r'^delete_book/(?P<id_code>[0-9]+)/$',views.delete_book)
將參數的名字命為id_code,函數接收時,以關鍵字接收
def delete_book(request,id_code):pass id_code也可換成**kwargs
等同于def delete_book(request,id_code=None):pass id_code
有id_code這個變量傳過來時,id_code的值為傳來的值
這樣URLconf會更加明晰且不容易產生參數順序問題的錯誤

分組匹配請求和?name=num請求總結

1.?name=num請求:

URLconf 在請求的URL上查找將它當做一個普通的Python字符串。不包括GET和POST參數以及域名。 例如,http://www.example.com/myapp/ 請求中,URLconf 將查找myapp/。、 在http://www.example.com/myapp/?id=3 請求中,URLconf 仍將查找myapp/。 ?id=3作為一個參數封裝到request中。函數只接收request一個參數
請求將id=3以字典的形式發給后端{id:3}后端函數不需要用參數接收,使用request.GET.get
def delete_book(request):print(request.GET) #<QueryDict: {'id': ['3']}>print(request.GET.get("id")) #3

2.分組匹配

而在使用個分組匹配的時候,還需要接收request之外的參數,直接接收這個參數就能用
后端需要接收
def delete_book(request,id):print(id) #接收到的參數可直接用

3.捕獲的參數永遠都是字符串

4.視圖函數中指定默認值

urlpatterns = [url(r'^blog/$', views.page),url(r'^blog/pag(?P<num>[0-9]+)/$', views.page),#只捕獲括號里包的內容 ] # views.py中,可以為num指定默認值 def page(request, num="1"):pass 兩個URL模式指向相同的view - views.page - 但是第一個模式并沒有從URL中捕獲任何東西。
如果第一個模式匹配上了,page()函數將使用其默認參數num=“1”,如果第二個模式匹配,page()將使用正則表達式捕獲到的num值。

路由分發 include

當Django中用到多個app時,用到include,
1.新建app python manage.py startapp app01
2.在setting中INSTALLED_APPS中添加'app01.apps.App01Config',
3.在app01中新建urls文件,項目中的urls相當于一級路由,app01中的urls相當于二級路由
4.在app01中的urls添加配置文件 from django.conf.urls import url 導入同文件中的views文件可以用 from . import views 也可以 from app01 import views urlpatterns=[url(r'^delete_book/(?P<id_code>[0-9]+)/$',views.delete_book) ] 添加關系 5.在一級路由中操作:
需要先導入include模塊 from django.conf.urls import include
再導入app01中的urls文件 from app01 import urls
在urlpatterns中添加對應關系:
url(r'^app01/',include(urls)) 把app01開頭的請求交給二級路由處理
在網頁上輸入http://127.0.0.1:8000/delete_book/ 網頁找不到,在一級路由中更沒有以delete_book開頭的路徑
需要加上app01 http://127.0.0.1:8000/app01/delete_book/
6.在一級路由中導入多個app的urls時,為了區別,取別名使用 from app01 import urls as app01_urls from app02 import urls as app02_urls url(r'^app01/',include(app01_urls)) url(r'^app01/',include(app02_urls)) 7.也可以傳遞額外的參數,在二級路由中傳參,以字典的形式,不常用
如:在app01的urls中
url(r'^house/',views.house,{"age":18})
在執行函數中接收即可:
def house(request,args): #如是age。則顯示18
print(args) 得到字典

URL反向解析reserve

簡單來說就是可以給我們的URL匹配規則起個名字,一個URL匹配模式起一個名字。
以后就不需要寫死URL代碼了,只需要通過名字來調用當前的URLurl中:
之前的格式:url(r'^book_list/$', views.book_list), 1.使用url解析:url(r'^book_list/$', views.book_list,name="check_book"), HTML模板中引用:
之前的格式:<a class="btn btn-danger" href="/delete_book/?id={{ book.id }}">刪除</a>#}使用反向解析: <a class="btn btn-danger" href="{% url 'check_book' book.id %}">刪除</a>#} views中引用使用reverse:
return redirect("/book_list/") 重定向from django.urls import reversedef del_book(request) rediret_url=reverse('check_book')
    return redirect(rediret_url)

總結:

1. 怎么起別名?
在url匹配模式中,定義name="別名"
2. 如何使用?
1. 在模板語言里面使用:
{% url "別名" %} --> 得到具體的URL路徑
2. 在視圖中如何使用:
from django.urls import reverse
reverse("別名") --> 得到具體的URL路徑
3. 如何傳參數?
1. 模板語言中:
{% url "別名" 2018 "nb" %}
2. 視圖函數中:主要用于重定向
def del_book(request) #不接收參數。如果使用重定向捕獲到值,就需要接受參數傳位置參數:傳的是個元祖reverse_red=reverse("別名", args=(2018, "nb")) #參數在這里傳return redirect(reverse_red)傳關鍵字參數:傳的是字典reverse("別名" kwargs={"year": 2018, "title": "nb"})

名稱空間

由于name沒有作用域,Django在反解URL時,會在項目全局順序搜索,當查找到第一個name指定URL時,立即返回
不小心在不同的app的urls中定義相同的name時,可能會導致URL反解錯誤,為了避免這種事情發生,引入了命名空間。 project的urls.py: urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^app01/', include("app01.urls",namespace="app01")),url(r'^app02/', include("app02.urls",namespace="app02")), ] app01.urls: urlpatterns = [url(r'^index/', index,name="index"), ] app02.urls: urlpatterns = [url(r'^index/', index,name="index"), ]

views

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

總結

1.請求在Django路由分配的五個步驟:
   1.從project/urls.py(和settings是同級的)開始找起
2.所有的urls.py都要有個urlpatterns這個變量,變量是個列表
3.遍歷上面的列表,依次匹配,如果匹配到就立即停止,調用后面的函數
4.調用函數時可以傳遞參數
5.如果整個列表都沒有匹配上,就拋出異常
2.URL正向:
     1.正則表達式里有分組匹配的話,會傳位置參數

2.正則表達式里有命名分組匹配的話,會傳關鍵字參數
3.直接傳參數
3.反向解析URL:給正則表達式起別名,然后根據別名反向圖到處真正的URL
4. print(request.get_full_path()) # 獲取當前請求的路徑和參數
print(request.path_info) # 取當前請求的路徑 ?

?

?

?

?



轉載于:https://www.cnblogs.com/zgf-666/p/9219151.html

總結

以上是生活随笔為你收集整理的路由系统(urls.py)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。