Django—路由层,视图层
路由層urls
瀏覽器會自動給url后加一個(gè)“/” django會自動給路由的正則表達(dá)式前面加一個(gè)“/” django會給任何不帶“/”結(jié)尾的url語句添加“/”(可設(shè)置) 短路路由規(guī)則:匹配到第一條就忽略后面所有! 所以路由順序很重要!注意:第一個(gè)參數(shù)是正則表達(dá)式,匹配規(guī)則按照從上往下一次匹配,匹配到一個(gè)之后立即匹配,直接執(zhí)行對應(yīng)的視圖函數(shù)
網(wǎng)站首頁路由
url(r'^$',views.home)
網(wǎng)站不存在頁面
url(r'',views.error)
url映射一般是一條正則表達(dá)式,“^” 字符串的開始,“$“ 字符串的結(jié)束
當(dāng)寫成\^$不輸入任何url時(shí)不會在返回黃頁,而是返回后面函數(shù)里對應(yīng)的頁面。一般這一條會寫在url的最后
無名分組
將加括號的正則表達(dá)式匹配到的內(nèi)容當(dāng)做位置參數(shù)自動傳遞給對應(yīng)的視圖函數(shù) url(r'^test/(\d+)/',views.test), # 匹配一個(gè)或多個(gè)數(shù)字def test(request,xxx):print(xxx)return HttpResponse('test')有名分組
將加括號的正則表達(dá)式匹配到的內(nèi)容當(dāng)做關(guān)鍵字參數(shù)自動傳遞給對應(yīng)的視圖函數(shù) url(r'^test/(?P<year>\d+)/',views.test), # 匹配一個(gè)或多個(gè)數(shù)字def test(request,year):print(year)return HttpResponse('test')注意
注意:無名分組和有名分組不能混著用!!! url(r'^test/(\d+)/(?P<year>\d+)/',views.test) 但是支持用一類型多個(gè)形式匹配 無名分組多個(gè)url(r'^test/(\d+)/(\d+)/',views.test), 有名分組多個(gè)url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test),反向解析(根據(jù)名字動態(tài)獲取到對應(yīng)路徑)
試想一個(gè)場景,你有200多個(gè)a標(biāo)簽,href都指向index/,有一天在urls里面index改為了new_index,那么你只能手動改變a標(biāo)簽中的href,當(dāng)你改完,又變成了my_index,那么一天的時(shí)間都可能在改地址,那么有沒有什么方法,不再把程序?qū)懰?#xff0c;反向解析就是應(yīng)用于此。
通過名字反向推導(dǎo)出頁面文件,類似于字典
?
from django.shortcuts import reverseurl(r'^index6668888/$',views.index,name='index') # 可以給每一個(gè)路由與視圖函數(shù)對應(yīng)關(guān)系起一個(gè)名字 # 這個(gè)名字能夠唯一標(biāo)識出對應(yīng)的路徑 # 注意這個(gè)名字不能重復(fù)是唯一的?
?
?
前端反向解析
{% url 'index' %} # {% url '放urls.py中路由與視圖函數(shù)的name的值' %}
后端反向解析
正則里面的路徑名之后就可以任意修改了 name里面的值不建議修改
from django.shortcuts import reverse def test(request):res=reverse('index')print(res)return render(request,'test.html')無名分組反向解析
前端反向解析
后端反向解析
前端模板語法
{%for user_obj in user_list%}<a href='edit/{{ user_obj.pk }}/'></a> {% endfor %}視圖函數(shù)
from django.shortcuts import reverse def edit(request,edit_id):url = reverse('edit',args=(edit_id,))模板
{% url 'edit' edit_id %}有名分組反向解析
{% url 'index' 1 %} # {% url '放urls.py中路由與視圖函數(shù)的name的值' %} 推薦你用這種<a href="{% url 'index' year=1 %}">999</a> res = reverse('index',args=(1,)) # 推薦你用這種 res = reverse('add',kwargs={'year':1}) url = r'^反向/無名(有名)',view.'(傳無名)',name=('反向') def xxx (request 無名)reverse('反向',args(無名,))render(request,'.html',{'無名':無名}) 前端 href={%url '反向' 無名%}路由分發(fā)(include)
項(xiàng)目總路由不再干路由與視圖函數(shù)匹配的活,而是做一個(gè)中轉(zhuǎn)站
django每一個(gè)app下面都可以有自己的urls.py路由層,templates文件夾,static文件夾
項(xiàng)目名下urls.py(總路由)不再做路由與視圖函數(shù)的匹配關(guān)系而是做路由的分發(fā)
注意:路由分發(fā) ?注意路由分發(fā)總路由千萬不要$結(jié)尾
# 在應(yīng)用下新建urls.py文件,在該文件內(nèi)寫路由與視圖函數(shù)的對應(yīng)關(guān)系即可 from django.conf.urls import url from app01 import views urlpatterns = [url(r'^index/',views.index) ]簡便寫法
內(nèi)部用到了反射
名稱空間(了解)
如果兩個(gè)app下起了相同的名字,那么反向解析不支持自動查找應(yīng)用前綴
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.pyreverse('app01:index')app02.views.pyreverse('app02:index')偽靜態(tài)頁面
假裝自己的路徑是一個(gè)靜態(tài)(數(shù)據(jù)寫死的)文件的路徑,其實(shí)你 是經(jīng)過了視圖函數(shù)處理,動態(tài)渲染頁面 提高百度收藏你這個(gè)網(wǎng)頁力度,當(dāng)別人搜索你這個(gè)頁面相關(guān)的內(nèi)容 百度會優(yōu)先展示你的頁面(這樣雖然能提高你網(wǎng)頁被訪問概率,但是還是干不過RMB玩家)url(r'^index.html',views.index,name='app01_index')
?虛擬環(huán)境(演示一下虛擬環(huán)境,下載django2.0測試自定義轉(zhuǎn)換器)
由來:
? ? 每個(gè)項(xiàng)目用到的模塊不一樣
目的:
? ? 為了讓每一個(gè)項(xiàng)目都有僅僅屬于自己的項(xiàng)目解釋器
使用:
? ? new project的時(shí)候選擇虛擬環(huán)境創(chuàng)建項(xiàng)目
? ? 如果勾選了下面的make to all project你創(chuàng)建的虛擬環(huán)境就能夠被其他新建的項(xiàng)目使用
?
?
?django2.0與django1.0的區(qū)別(了解)
?1.0里面的url對應(yīng)django2.0里面re_path
django2.0里面的path第一個(gè)是精準(zhǔn)匹配(你怎么寫的,我就怎么匹配)
django1.0版本中匹配到的參數(shù)都是字符串類型
?
django2.0轉(zhuǎn)換器(了解)
1.0版本的url和2.0版本的re_path分組出來的數(shù)據(jù)都是字符串類型
默認(rèn)有五個(gè)轉(zhuǎn)換器,感興趣的自己可以課下去試一下
str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認(rèn)的形式
int,匹配正整數(shù),包含0。
slug,匹配字母、數(shù)字以及橫杠、下劃線組成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
path('index/<str:id>/',index )
自定義轉(zhuǎn)換器
1.正則表達(dá)式
2.類
3.注冊
視圖層(views.py)
django必會三板斧
1.HttpResponse >>> 返回字符串
2.render >>> 支持模板語法,渲染頁面,并返回給前端
3.redirect >>> 重定向(即可以重定向到別人的網(wǎng)址,也可以重定向到自己路由)
django返回的數(shù)據(jù)都是HttpResponse對象
JsonResponse(返回json格式的數(shù)據(jù))
FBV與CBV
FBV:基于函數(shù)的視圖
CBV:基于類的視圖
url(r'^login/',views.MyCls.as_view()) # >>>等價(jià)于 url(r'^login/',views.view)
?查看源碼
為什么我get請求就走get方法,post請求就走post方法
文件上傳
前端需要注意的點(diǎn):
1.method需要指定成post
2.enctype必須是multipart/form-data
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhengyuli/p/11000582.html
總結(jié)
以上是生活随笔為你收集整理的Django—路由层,视图层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四章 生命周期函数--35 vue-r
- 下一篇: 说下Java堆空间结构,及常用的jvm内