新聞中心
如何進(jìn)行Django框架urls.py路由設(shè)置,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
路由系統(tǒng)是把接收到的請(qǐng)求,根據(jù)網(wǎng)址進(jìn)行匹配,指定處理請(qǐng)求的函數(shù)或類。
路由系統(tǒng)分類:
網(wǎng)站框架路由系統(tǒng)一般分為兩類,F(xiàn)BV,CBV,Django兩者都支持,但有的框架只支持一種。
FBV(Function Base View ): 函數(shù)基于視圖,在views.py中,使用函數(shù)處理請(qǐng)求。
CBV(Class Base View):類基于視圖,在views.py中,使用類處理請(qǐng)求。
URLS.PY文件路由配置
兩個(gè)功能,一個(gè)是直接轉(zhuǎn)到函數(shù),一個(gè)是轉(zhuǎn)到下級(jí)urls.py路由
urlpatterns=[ path(r'blog/', blog.views.index), path(r'bbs/', bbs.views.index) ]1、路由規(guī)則模塊匹配函數(shù)url,path,re_path:
Django 1.XX使用url函數(shù),可以使用正則,可以使用固定字符串
Django 2.XX以后使用path和re_path,
from django.conf.urls import url # django 1.XX使用 url from django.conf.urls import url, re_path # django 2.XX 使用 url和re_path from django.urls import path, re_path # django 2.1X 以后集成,使用 path和re_pathurl:url()函數(shù)傳遞了四個(gè)參數(shù),兩個(gè)必需:regex和view,以及兩個(gè)可選:kwargs,和name。也就是正則表達(dá)式和視圖是兩個(gè)必填參數(shù)。
1.xx版本--完成正則和固定匹配
2.xx版本--保留
path:完成指定字符串或格式的匹配,函數(shù) path() 具有四個(gè)參數(shù),兩個(gè)必須參數(shù):route
和 view
,兩個(gè)可選參數(shù):kwargs
和 name
。即路由和視圖是必填參數(shù)
2.1x以后版本-- 完成固定匹配
re_path:正則匹配,path完成不了的匹配
2.xx版本--原生位置django.conf.urls
--后集成位置django.urls
2、path函數(shù):
格式:path(匹配規(guī)則, views視圖函數(shù)或類方法, **kwargs, name)
匹配規(guī)則:不支持正則,但自身提供了五種匹配模式
int 匹配0和正整數(shù),如 1230
str 匹配任何非空字符串但不包括/,
slug 匹配字母、數(shù)字以及橫杠、下劃線組成的字符串。
uuid 匹配一個(gè)uuid對(duì)象,如 075194d3-6885-417e-a8a8-6c931e272f00。(該對(duì)象必須包括破折號(hào)—,所有字母必須小寫)
path 匹配所有的字符串 包括/(意思就是path前邊和后邊的所有)
views視圖或類方法:app的views.py的方法,或類方法
kwargs:向views傳遞的參數(shù)
name:后端反向解析,前端根據(jù) name值找到解析路由
3、path--匹配規(guī)則:
一般分為三種情況,嚴(yán)格匹配,帶參匹配,固定格式參數(shù)匹配
from django.urls import path, re_path import index.views import pathtest.views urlpatterns = [ path(r'pathtest/', pathtest.views.index), # r'pathtest/'嚴(yán)格匹配,前端使用pathtest/ 1 2 3傳參是會(huì)報(bào)錯(cuò)。 # The current path, pathtest/ 1 2 3, didn't match any of these. path(r'pathtest4、path--views視圖或類方法
指定本條規(guī)則,處理請(qǐng)求的views.py的函數(shù)(FBV)或類(CBV):
FBV:urls.py處理請(qǐng)求后,把請(qǐng)求交給函數(shù)index,index處理后,返回pathtest.html頁面給客戶端。
urls.py
from django.urls import path, re_path import index.views urlpatterns = [ path(r'pathtestviews.py
from django.shortcuts import render def index(request,*args,**kwargs): para = [] if kwargs: for k,v in kwargs.items(): print(k,':',v) if args: for i in args: print(i) return render(request, 'pathtest.html', {'para': para})CBV:
1、Class需要繼承django.views.generic 的View類
2、URLS.py路由轉(zhuǎn)發(fā)到 APP.views.類.as_view()
3、as_view()是繼承View類,不需要自己重寫
4、查看generic\base.py 的as_view方法,看到是通過hasattr進(jìn)行判斷用戶請(qǐng)求方式
通過dispach 執(zhí)行相對(duì)應(yīng)的請(qǐng)求方法函數(shù)
5、可以通過向 http_method_names注冊(cè) 新的方法實(shí)現(xiàn)自定義
實(shí)例:
http://127.0.0.1:8000/pathtest1/ 顯示CBV1
http://127.0.0.1:8000/pathtest2/ 顯示CBV2
URL.py
from django.urls import path, re_path import pathtest.views urlpatterns = [ path(r'pathtest1/', pathtest.views.CBV1.as_view()), path(r'pathtest2/', pathtest.views.CBV2.as_view()) ]APP:pathtest Views.py
from django.view.generic import class CBV1(View): def get(self,request,*args,**kwargs): return HttpResponse('CBV1
') class CBV2(View): def get(self,request,*args,**kwargs): return HttpResponse('CBV2
')5、kwargs:向views傳遞的參數(shù)
可以向views傳遞字典型參數(shù),views函數(shù)可以使用實(shí)參或形參接收,使用形參接收時(shí),通過path函數(shù)傳遞的參數(shù)始終在url網(wǎng)址傳遞的參數(shù)前。
urls.py
urlpatterns = [path(r'pathtest1/views.py
class CBV1(View): def get(self,request, *args, **kwargs): # 使用實(shí)參接收def get(self,request, since, *args, **kwargs): para = [] if kwargs: for k,v in kwargs.items(): print(k,':',v) para.append(v) return HttpResponse('CBV2{}
'.format(para)) # 訪問:http://127.0.0.1:8000/pathtest1/0010 # 網(wǎng)頁顯示:CBV2['O-K', 10]6、name: 定義后,使用{%url 'name值引用'%} ,url代指當(dāng)前網(wǎng)址。
views渲染HTML模板{%url 'name值' %}時(shí),根據(jù)name值找到urls.py中對(duì)應(yīng)的path路由,
把path匹配規(guī)則字符串替換到 HTML模板的‘name值’
urls.py
urlpatterns = [ path(r'pathtest1/', pathtest.views.CBV1.as_view()), # 定義正向路由http://127.0.0.1:8000/pathtest1/訪問CBV1 path(r'pathtest2/views.py
form django.shorsturc import HttpResponse, reverse class CBV2(View): def get(self,request,page_num, *args, **kwargs): route_path=reverse('patht', args=(page_num,)) # reverse,轉(zhuǎn)換成際的URL地址,patht是urls里的name值,轉(zhuǎn)換成匹配值 # args:地址里的參數(shù)個(gè)數(shù),幾個(gè)就寫幾個(gè),比如四個(gè)(page_num1,page_num2,page_num3,page_num4) print(route_path) # 打印出來 return HttpResponse('CBV2:
page_num:{}
'.format(page_num)) #根據(jù)點(diǎn)擊的鏈接不同,獲取的返回值也不同
class CBV1(View):
def get(self,request, *args,**kwargs):
return render(request, 'pathtest.html')html:
\\使用patht的name名來定義網(wǎng)址路由,后面的123是獲取值,所以,三個(gè)鏈接都會(huì)執(zhí)行views的CBV2 num numb/a> numbe結(jié)果:
訪問:http://127.0.0.1:8000/pathtest1/,點(diǎn)擊html里的任何鏈接都會(huì)執(zhí)行CBV2,因?yàn)槎x了name值。
點(diǎn)擊任意一個(gè)鏈接,views的route_path:/pathtest2/100
7、自定義path匹配規(guī)則。
path里默認(rèn)有四個(gè)匹配規(guī)則,int,str,slug,uuid,path,
也可以自定義匹配規(guī)則,步驟:定義類;使用register_converter
注冊(cè);使用。
urls.py
from django.urls import path, register_reverter import pathtest.views class NumLine: # 第一步,定義類 regex='[-0-9]+' def to_python(self, value): return str(value) //可以進(jìn)行類型的轉(zhuǎn)換和處理,再返回 def to_url(self, value): return str(value) //可以進(jìn)行類型的轉(zhuǎn)換和處理,再返回 # 第二步,向轉(zhuǎn)換器里注冊(cè)自定義類,并起個(gè)名numline register_reverter(NumLine,'numline') urlpatterns=[ path(r'pathtest1/', pathtest.views.CBV1.as_view()), path(r'ppppppppp/APP:pathtest views.py
from django.shortcuts import HttpResponse, render, reverse from django.views.generic import View class CBV1(View): def get(self,request): return render(request,'pathtest.html') class CBV2(View): def get(self,request,data1, data2): full_path = reverse('patht',args=(data1,data2)) return HttpResponse('Full path:{}
CBV2:
page_num:{},{}
'.format(full_path, data1, data2))pathtest.html
number //字符型參數(shù)傳入時(shí),一定要加引號(hào) number //這里的-不報(bào)錯(cuò),因?yàn)樽R(shí)別成了負(fù)數(shù) number結(jié)果:訪問時(shí),只識(shí)別傳入的-和0-9,其它參數(shù)報(bào)錯(cuò)。
8、path路由分發(fā)到APP的urls.py(二級(jí)路由)。
使用include方法進(jìn)行指定,include從django.urls導(dǎo)入
格式:path(r'pathreg/',include('app.urls')) ,include('APP名.APP路由文件')
project: urls.py
from django.urls import path, include urlparrents=[ path(r'pathreg/',include('pathtest.urls')), ]app: urls.py
from django.urls import path, include from pathtest import views urlparrents=[ path(r'',views.CBV1.as_view()), path(r'index/',views.CBV2.as_view()), ]app: views.py
from django.shortcuts import HttpResponse from django.views.generic import View class CBV2(View): def get(self,request): return HttpResponse('index page
') class CBV1(View): def get(self, request): return HttpResponse('default page')
結(jié)果:http://127.0.0.1:8000/pathreg/,經(jīng)過project的urls路由文件匹配pathreg,分發(fā)到app的urls路由文件,調(diào)用CBV1顯示default page
http://127.0.0.1:8000/pathreg/index,經(jīng)過project的urls路由文件匹配pathreg,分發(fā)到app的urls路由文件匹配index,調(diào)用CBV1顯示index page
9、re_path:支持正則匹配,其它參數(shù)與path一樣
與Django1.xx版本的url功能一樣
10、給CBV增加自定義提交方法:
找到 django.views.generic .View類,
默認(rèn)提供了http_method_names列表里的方法,
as_view函數(shù)進(jìn)行了一些參數(shù)等判斷,
最后返回了dispach方法,
dispach通過反射(getattr)執(zhí)行相應(yīng)的函數(shù)
增加自定義提示方法:
1)向http_method_names列表添加方法名,http_method_names.append('kill')
2)在app.views.py里定義kill函數(shù)
通過重寫dispach方法,給所有方法增加因定操作
def dispatch(self, request, *args, **kwargs): print('操作前的操作') obj = super(Cbv,self).dispatch(request, *args, **kwargs) print('操作后的操作代碼') return obj11、命名空間:、
namespace,app_name,name
在project的urls配置namespace(實(shí)例命名空間),同時(shí)要在跳轉(zhuǎn)APP的urls配置 app_name(應(yīng)用命名空間)
主要是實(shí)現(xiàn)以APP名區(qū)分的路由轉(zhuǎn)發(fā)。
# urls.py: path('/a/', include('test.urls', namespace='author')) # namespace **必須 # test/urls.py: app_name='dync_name' # app_name,根據(jù)urls的namespace改變。 **必須在url里注冊(cè),如果與namespace一樣默認(rèn)指向namespace re_path(r'^test/(?P看完上述內(nèi)容,你們掌握如何進(jìn)行Django框架urls.py路由設(shè)置的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁標(biāo)題:如何進(jìn)行Django框架urls.py路由設(shè)置-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/cdoeso.html