路由層
無名分組
有名分組
反向解析
路由分發
名稱空間
僞靜態的概念html
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',views.test), url(r'testadd',views.testadd), ]
路由一旦匹配就再也不走下面的路由匹配關係了
路由增長首頁的方式前端
url(r'^$',views.home)
路由增長尾頁的方式(當全部的路徑都匹配不上時,給我返回404提示信息)python
url(r'',views.error) 切記必須加在最後
無名分組 git
url(r'^test/([0-9]{4})/', views.test),
會將加了括號的正則表達式匹配的內容當作位置參數傳遞給後面的視圖函數正則表達式
具體操做以下:django
有名分組json
url(r'^test/(?P<year>\d+)/',views.test)
會將加了括號的正則表達式匹配的內容當作關鍵字參數傳遞給後面的視圖函數
關鍵字就是你尖括號裏面的名字(year)後端
具體操做以下:app
有名分組和無名不能混合使用!!!
只要不混着用,有名分組和無名分組支持多個相同類型的傳參函數
反向解析:
試想一個場景,你有200多個a標籤,href都指向index/,有一天在urls裏面index改成了new_index,那麼你只能手動改變a標籤中的href,當你改完,又變成了my_index,那麼一天的時間均可能在改地址,那麼有沒有什麼方法,再也不把程序寫死,反向解析就是應用於此。
經過名字反向推導出頁面文件,相似於字典
前端反向解析
{% url 'add' %} # {% url '放urls.py中路由與視圖函數的name的值' %}
後端反向解析
url(r'^testadd123/$',views.testadd,name='add')
相對於前面的綁定關係,只要經過name的值就能找到前面的路徑
from django.shortcuts import reverse res = reverse('add') print(res)
無名分組的反向解析
前端反向解析
{% url 'add' 1 %} # {% url '放urls.py中路由與視圖函數的name的值' %}
後端反向解析
url(r'^testadd123/(\d+)/$',views.testadd,name='add')
from django.shortcuts import reverse res = reverse('add',args=(1,))
有名分組的反向解析
前端反向解析
{% url 'add' 1 %} # {% url '放urls.py中路由與視圖函數的name的值' %} 推薦你用這種 <a href="{% url 'add' year=1 %}">999</a>
後端反向解析
res = reverse('add',args=(1,)) # 推薦你用這種 res = reverse('add',kwargs={'year':1})
小口訣
url = r'^反向/無名(有名)',view.'(傳無名)',name=('反向') def xxx (request 無名) reverse('反向',args(無名,)) render(request,'.html',{'無名':無名}) 前端 href={%url '反向' 無名%}
推導:
url(r'^edit/(\d+)/',views.edit,name='edit_user') {%for user_obj in queryset %} edit/?id={{user_obj.pk}} edit/?id={{user_obj.pk}} edit/?id={{user_obj.pk}} {%for user_obj in queryset %} edit/{{user_obj.pk}}/ >>> url(r'^edit/(\d+)/') def edit(request,edit_id) url = reverse('edit_user',args=(edit_id,)) edit/{{user_obj.pk}}/ edit/{{user_obj.pk}}/ edit/{{user_obj.pk}}/
路由分發(include):
總路由再也不直接作路由與視圖函數的對應關係,而是將獲取的路由分發給下面的app去處理對應關係
每個app下均可以新建本身的urls.py static文件夾 templates文件夾
項目總路由:
url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls))
應用子路由:
app01.urls.py
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ]
app02.urls.py
from django.conf.urls import url from app02 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')) # print(reverse('app01:aaa')) # print(reverse('app02:aaa'))
總結
總路由對子路由進行分發 from django.conf.urls import url,include url(r'^app01/',include('app01.urls')) url(r'^app02/',include('app02.urls')) 再在子路由app下建立urls from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index,name='app01_aaa') ] views def index(request): print(reverse('app02_aaa')) return HttpResponse('.....')
僞靜態
僞裝本身的路徑是一個靜態(數據寫死的)文件的路徑,其實你
是通過了視圖函數處理,動態渲染頁面
提升百度收藏你這個網頁力度,當別人搜索你這個頁面相關的內容
百度會優先展現你的頁面(這樣雖然能提升你網頁被訪問機率,可是仍是幹不過RMB玩家)
路由層結束了!!!
虛擬環境(演示一下虛擬環境,下載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 )
django2.0自定義轉換器
須要三步走戰略
# 自定義轉換器
class FourDigitYearConverter: regex = '[0-9]{4}' def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value register_converter(FourDigitYearConverter, 'yyyy') urlpatterns = [ path('admin/', admin.site.urls), # path('index/<int:id>/',index ), # path('index/<str:id>/',index ), path('login/<yyyy:name>/',index) ]
視圖層(views.py)
django必會三板斧
1.HttpResponse >>> 返回字符串
2.render >>> 支持模板語法,渲染頁面,並返回給前端
3.redirect >>> 重定向(便可以重定向到別人的網址,也能夠重定向到本身路由)
django返回的數據都是HttpResponse對象
JsonResponse(返回json格式的數據)
FBV與CBV
FBV:基於函數的視圖
CBV:基於類的視圖
from django.views import View
class Login(View):
def get(self,request):
# return HttpResponse('get')
return render(request,'login.html')
def post(self,request):
return HttpResponse('post')
查看as_view()源碼
源碼補充:
第一個疑問:
url(r'^login/',views.Login.as_view()) # >>>等價於 url(r'^login/',views.view)
第二個疑問:
爲何我get請求就走get方法,post請求就走post方法
文件上傳
前端須要注意的地方
form表單method必須是post
enctype必須是multipart/form-data
後端須要注意的是
def upload(request): if request.method == 'POST': # print(request.FILES) # print(type(request.FILES)) # print(request.FILES.get('myfile')) # print(type(request.FILES.get('myfile'))) # 獲取文件對象 file_obj = request.FILES.get('myfile') # print(file_obj.name) # 獲取文件名 file_name = file_obj.name # 文件讀寫操做 with open(file_name,'wb') as f: # for line in file_obj: for line in file_obj.chunks(): f.write(line) return render(request,'upload.html')
request的八種屬性:
request.GET
request.POST
request.method
request.body 原始數據
request.path # /upload/
request.get_full_path() # /upload/?id=1
request.META 網頁原信息
request.FILES 文件
原文出處:https://www.cnblogs.com/gengbinjia/p/10713110.html