Django路由与视图
路由層
一.路由匹配規(guī)則:
第一個參數(shù)是正則表達式,匹配規(guī)則按照從上往下一次匹配,匹配到一個之后立即匹配,直接執(zhí)行對應(yīng)的視圖函數(shù)
url(r'login', views.login),如果按上面的形式匹配的話就成模糊匹配了,login的前面沒有限制條件,可以輸入任意的字符串,login的后面也沒有限制條件也是可以輸入任意的字符串,這樣的話導(dǎo)致只要我路徑里面有l(wèi)ogin這樣的關(guān)鍵字無論我輸入什么都沒有關(guān)系,都可以訪問的到,怎么解決方式是在前面加^h和后面加$符號,這樣的話就限制了,只要能是路徑對了才能訪問到,如下。
url(r'^login/$', views.login), #然后去寫對應(yīng)的視圖函數(shù)就可以了網(wǎng)站首頁路由配置:
url(r'^$', views.login), #然后去寫對應(yīng)的視圖函數(shù)就可以了網(wǎng)頁錯誤路由設(shè)置:
url(r'',views.error) #然后去寫對應(yīng)的視圖函數(shù)就可以了二.有名分組和無名分組傳參
無名分組(將加括號的正則表達式匹配到的內(nèi)容當做位置參數(shù)自動傳遞給對應(yīng)的視圖函數(shù))
路由層
url(r'^login/([0-9]{4})$', views.login), # ([0-9]{4})匹配4個數(shù)字然后進行分組視圖函數(shù)層
def login(request,year): # 如果分了一個組的話一定要的對應(yīng)的視圖函數(shù)加上一個函數(shù),如果有兩個就加上兩個參數(shù)print(year) # http://127.0.0.1:8000/login/2019 打印結(jié)果就是2019return render(request,'login.html')多個無名分組
路由層
url(r'^login/([0-9]{4})([0-9]{2})$', views.login), # ([0-9]{4})匹配4個數(shù)字然后進行分組 ([0-9]{2}) 匹配2個數(shù)字然后進行分組視圖函數(shù)層:
def login(request,*args): # 如果分了一個組的話一定要的對應(yīng)的視圖函數(shù)加上一個函數(shù),如果有兩個就加上兩個參數(shù)print(agrs) # http://127.0.0.1:8000/login/2019/06 打印結(jié)果就是(2019,06)return render(request,'login.html')有名分組:
有名分組(將加括號的正則表達式匹配到的內(nèi)容當做關(guān)鍵字參數(shù)自動傳遞給對應(yīng)的視圖函數(shù))
? 注意:無名分組和有名分組不能混著用!!!
路由層:
url(r'^index/(?P<year>\d+)/',views.index)視圖函數(shù)層方式一:
def index(request,year):print(year)return HttpResponse('test')視圖函數(shù)層方式二
def index(request,**kwargs):print(kwargs)return HttpResponse('test')反向解析
根據(jù)名字動態(tài)獲取對應(yīng)的路徑
前端模板方式
語法 {% url '路由的別名' %}
路由層:
url(r'^index111/', views.index,name='xxx'),# 可以給每一個路由與視圖函數(shù)對應(yīng)關(guān)系起一個名字# 這個名字能夠唯一標識出對應(yīng)的路徑# 注意這個名字不能重復(fù)是唯一的前端模
<p><a href="{% url 'xxx' %}">1111111111111</a></p>s后端方式
語法 reverse('路由的別名')
url(r'^index111/', views.index,name='xxx'),視圖函數(shù)層
def index(request):if request.method == 'POST':url = reverse('xxx')return redirect(url)return render(request,'index.html')無名分組反向解析
后端
路由
url(r'^index/([0-9]{4})/', views.index,name='xxx'),視圖函數(shù)
def index(request,*age):rl = reverse('xxx', args=(2019,))print(rl)return render(request,'index.html')前端
路由
url(r'^index/([0-9]{4})/', views.index,name='xxx'),前端html頁面
<p> <a href='{ % url 'xxx' 2019 % }'><a> <p>有名分組反向解析
后端使用# 后端有名分組和無名分組都可以用這種形式print(reverse('list',args=(10,)))# 下面這個了解即可print(reverse('list',kwargs={'year':10}))前端使用# 前端有名分組和無名分組都可以用這種形式{% url 'list' 10 %}# 下面這個了解即可{% url 'list' year=10 %}總結(jié):針對有名分組與無名分組的反向解析統(tǒng)一采用一種格式即可
后端
reverse('list',args=(10,)) # 這里的數(shù)字通常都是數(shù)據(jù)的主鍵值
前端
{% url 'list' 10 %}
反向解析的本質(zhì):就是獲取到一個能夠訪問名字所對應(yīng)的視圖函數(shù)
路由分發(fā)
路由分發(fā)django每一個app下面都可以有自己的urls.py路由層,templates文件夾,static文件夾項目名下urls.py(總路由)不再做路由與視圖函數(shù)的匹配關(guān)系而是做路由的分發(fā) 路由分發(fā)的兩種方式:方式一:總路由:# 不需要導(dǎo)入任何東西url(r'^app01','app01.urls'),url(r'^app02','app02.urls')app01路由:在你創(chuàng)建app01的時候是app01下面是沒有urls路由的需要自己手動創(chuàng)建,然后把項目文件夾下的總路由copy到app01的路由下urlpatterns = [url(r'^index/', views.index),]方式二:總路由:# 只需要導(dǎo)入include和app01與app02的urls并取別名并且去別名from django.conf.urls import url,includefrom app01 import urls as a1from app02 import urls as a2url(r'^app01',include(a1)),url(r'^app02',include(a2)),app01路由:在你創(chuàng)建app01的時候是app01下面是沒有urls路由的需要自己手動創(chuàng)建,然后把項目文件夾下的總路由copy到app01的路由下urlpatterns = [url(r'^index/', views.index),]名稱空間
名稱空間(了解) # 名稱空間是避免多個app之間視圖函數(shù)名重復(fù)url(r'^app01/',include(app01_urls,namespace='app01')),url(r'^app02/',include(app02_urls,namespace='app02')) app01.urls.pyfrom django.conf.urls import urlfrom app01 import viewsurlpatterns = [url(r'^index/',views.index,name='index')]app02.urls.pyfrom django.conf.urls import urlfrom app02 import viewsurlpatterns = [url(r'^index/',views.index,name='index')]app01.views.py reverse('app01:index')app02.views.py reverse('app02:index')偽靜態(tài)網(wǎng)頁:
偽靜態(tài)網(wǎng)頁搜索優(yōu)化seourl(r'^index.html',views.index,name='app01_index')虛擬環(huán)境
虛擬環(huán)境不同的項目配置不同的python解釋器django1.0與django2.0之間的區(qū)別django2.0里面的path第一個參數(shù)不支持正則,你寫什么就匹配,100%精準匹配django2.0里面的re_path對應(yīng)著django1.0里面的url雖然django2.0里面的path不支持正則表達式,但是它提供五個默認的轉(zhuǎn)換器str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認的形式int,匹配正整數(shù),包含0。slug,匹配字母、數(shù)字以及橫杠、下劃線組成的字符串。uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)自定義轉(zhuǎn)換器1.正則表達式2.類3.注冊# 自定義轉(zhuǎn)換器 class FourDigitYearConverter:regex = '[0-9]{4}'def to_python(self, value):return int(value)def to_url(self, value):return '%04d' % value # 占四位,不夠用0填滿,超了則就按超了的位數(shù)來! register_converter(FourDigitYearConverter, 'yyyy') PS:路由匹配到的數(shù)據(jù)默認都是字符串形式FBV與CBV
FBV與CBV FBV:基于函數(shù)的視圖 CBV:基于類的視圖CBV:url(r'^mycls/',views.MyCls.as_view())class MyCls(View):def get(self,request):return render(request,'index.html')def post(self,request):return HttpResponse('post')無論是FBV還是CBV路由層都是路由對應(yīng)視圖函數(shù)內(nèi)存地址 urlpatterns = [# url(r'^mycls/',views.view)url(r'^mycls/',views.MyCls.as_view()) ]class MyCls(View):def get(self,request):return render(request,'index.html')def post(self,request):return HttpResponse('post') 簡單的文件上傳 前端需要注意的點:1.method需要指定成post2.enctype需要改為formdata格式后端暫時需要注意的是1.配置文件中注釋掉csrfmiddleware中間件2.通過request.FILES獲取用戶上傳的post文件數(shù)據(jù)file_obj = request.FILES.get('my_file')print(file_obj.name)with open(file_obj.name,'wb') as f:for line in file_obj.chunks():f.write(line)轉(zhuǎn)載于:https://www.cnblogs.com/ZKPython/p/11000372.html
總結(jié)
以上是生活随笔為你收集整理的Django路由与视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React入门看这篇就够了
- 下一篇: 数据转数字类型的方法总结