urlpatterns = [ url(r'^admin/',admin.site.urls), url(r'^$',views.home), # 網頁首頁路由 url(r'^test/$',views.test), url(r'^testadd/$',views.testadd), url(r'',views.error) # 網頁不存在頁面 ] # 注意:第一個參數是正則表達式,匹配規則按照從上往下依次匹配,匹配到一個以後當即中止,直接執行對應的視圖函數
無名分組(將加括號的正則表達式匹配到的內容看成位置參數自動傳遞給對應的視圖函數)html
url(r'^test/(\d+)/',views.test), # 匹配一個或多個數字 def test(request,xxx): # xxx接收正則匹配到的數字 print(xxx) # 變量名本身定義 return HttpResponse('ok')
有名分組(將加括號的正則表達式匹配到的內容看成關鍵字參數自動傳遞給對應的視圖函數)前端
url(r'^test/(?P<year>\d+)',views.test) # 匹配一個或多個數字 def test(request,year): print(year) # 這裏的變量根據路由指定的 return HttpResponse('ok')
注意:無名分組和有名分組不能混着用,可是支持同一類型多個形式匹配python
#無名分組多個 url(r'^test/(\d+)/(\d+)',views.test), #有名分組多個 url(r'^test/(?P<year>\d+)/(?P<yyy>\d+)/',views.test)
反向解析:根據名字動態獲取到對應路徑,視圖層須要導入模塊reversegit
#能夠給每個路由與視圖函數對應關係起一個名字 #這個名字可以惟一標識出對應的路徑 #注意名字不能重複,是惟一的 url(r'^index666/$',views.index,name='index') from django.shortcuts import reverse #後端使用 reversr('index') #也能夠 reverse('路由與視圖函數對應關係起的別名') #前端使用 {% url 'index' %} #也能夠 {% url '別名' %}
url(r'^test/(\d+)/',views.test,name='list') #後端使用 reverse('list',args=(10,)) #這邊數字能夠自定義,能夠填數據的主鍵字段值,方便以後取出編輯 #前段使用 {% url 'list' 10 %}
url(r'^edit/(\d+)/',views.edit,name='edit') # 前端 {%for user_obj in user_list%} <a href='edit/{{ user_obj.pk }}/'></a> {% endfor %} #後端 from diango.shortcuts import reverse def edit(request,edit_id): url = reverse('edit',args=(edit_id,)) #模板 {% url 'edit' edit_id %}
#後端使用 reverse('list',arge=(10,)) #也能夠 reverse('list',kwargs={'year':10}) # 瞭解 #前端使用 {% url 'list' 10 %} #也能夠 {% url 'list' year=10 %} # 瞭解
總結:針對有名函數和無名函數的反向解析統一採用一種格式便可正則表達式
#後端 reverse('list',args=(10,)) #這裏的數字一般都是數據的主鍵值 #前端 {% url 'list' 10 %}
反向解析的本質:就是獲取到一個可以訪問名字所對應的視圖函數django
簡介:django每個app下均可以有本身的urls.py路由層,templates文件夾,static文件夾,項目名下的urls.py(總路由)再也不作路由與視圖函數的匹配關係而是作路由的分發json
#在路由層導入模塊 from django.conf.urls import url,include from app01 import urls as app01_urls from app02 import urls as app02_urls #路由分發,注意路由分發總路由不能以$結尾 url(r'^app01/',include(app01_urls)), # 防止重名 url(r'^app02/',include(app02_urls)) #也能夠不用起別名 url(r'^app01/',include('app01.urls')) url(r'^app02/',include('app02.urls')) #在應用下新建urls.py(約定俗成)文件,在該文件內寫路由與視圖的對應關係便可 from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ]
名稱空間(瞭解)後端
#總路由 url(r'^app01/',include(app01_urls,namespace='app01')), url(r'^app02/',include(app02_urls,namespace='app02')) #app01中urls.py from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index,name='index') ] #app02中urls.py from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^index/',views.index,name='index') ] #app01中views.py reverse('app01:index') #app02中views.py reverse('app02:index') #注意:這種瞭解一下就能夠了,不一樣app中起不一樣的名字就能夠了
搜索優化seoapp
url(r'^index.html',views.index,name='app01_index') #人爲加上後綴,讓百度誤覺得是靜態網頁保存起來,增長搜索機率
不一樣的項目配置不一樣的python解釋器函數
django2.0裏面的path不支持正則表達式,可是它提供了五個默認的轉換器:
from django.contrib import admin from django.urls import path,re_path,register_converter class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self,value): return int(value) def to_url(self,value): return '%04d'%value #佔4位,不夠用0填滿,超了則按照原來的位數 register_converter(FourDigitYearConverter,'yyyy') urlpatterns = [ path('admin/',views.site.urls), path('index/<yyyy:id>',views.index) ] #路由匹配到的數據默認都是字符串形式
FBV:基於函數的視圖
CBV:基於類的函數
#CBV: #路由層 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('ok')
JsonResponse是HttpResponse的子類,專門用來生成JSON編碼的響應
from django.http import JsonResponse def index(request): return JsonResponse({'name':'lucas大帥比','password':'123'},json_dumps_params={'ensure_ascii':False}) # 由於有中文,ensure_ascii保證以原樣返回 #json中 print(json.dumps({'name':'lucas大帥比','password':'123'},ensure_ascii=False))
前端form表單中須要注意的點:
後端暫時須要注意的是:
def upload_file(request): if request.method == 'POST': 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(): #for line in file_obj: f.write(line) return HttpResponse('ok') return render(request,'index.html')
print(request.path) #/upload_file/ print(request.get_full_path()) #/upload_file/?name=lucas,獲取完整路徑