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