路由層html
urlpatterns = [ url(r'^admin/',admin.site.urls), url(r'test',view.test), url(r'testadd',views.testadd), ] 路由一旦匹配就不會在往下匹配了 路由增長首頁的方式 url(r'^$',views.home) 路由增長尾頁的方式(當全部的路徑都匹配不上時,返回404界面) url(r'',views.error)
無名分組前端
url(r'^test/(\d+{4})',views.test)python
會將括號中的正則表達式匹配的內容看成位置參數傳遞給後面的視圖函數正則表達式
有名分組django
url(r'^test/(?<year>\d+{4})',views.test)json
會將括號內的正則表達式匹配的內容看成關鍵字參數傳遞給後面的視圖函數後端
有名分組和無名分組不能混合使用,只要不混合使用,有名分組,無名分組支持多個值傳參瀏覽器
反向解析 app
前端反向解析 {% url 'add' %} add = urls.py中路由與視圖函數的name的值 後端反向解析 from django.shortcuts import reverse url(r'^testadd/$',views.testadd,name='add') res = reverse("add")
無名分組的反向解析
前端反向解析
{% url 'add' 參數 %}
後端反向解析
from django.shortcuts import reverse
url(r'^testadd/(\d+)/$',views.testadd,name='add')
res = reverse('add',args=(值,))
有名分組反向解析
前端反向解析
{% url 'add' year %}
<a href="{% url 'add' year %}"></a>
後端反向解析
res = reverse('add',args=(值,))
res = reverse('add',kwargs={"year":1})
路由分發函數
總路由再也不直接作路由與視圖函數的對應關係,而是將獲取的路由分發給下面的app去處理對應關係
每個app下均可以新建本身的urls.py文件
總路由中:
from django.conf.urls import include
url(r'^app01/',include(app01_urls))
子路由總安裝總路由中的寫法,匹配視圖函數
名稱空間
能夠給incclude中的app命名一個名稱空間
url(r'^app01/',include(app01_urls, namespace='app01'))
僞靜態
僞裝本身的路徑是一個靜態文件的路徑,其實文件名是經過視圖函數處理的,內容仍是動態添加
虛擬環境
每一個項目用到的模塊不同,爲了讓每個項目都有僅僅屬於本身的解釋器
使用:新建項目的時候選擇虛擬環境建立解釋器
勾上Make available to all projects表示你建立的虛擬環境九年被其餘新項目使用
django2.0和django1.0的區別
1.0中的url對應2.0裏的re_path
2.0中的path第一個參數是精準匹配
2.0中的轉換器
1.0版本的url和2.0版本的re_path分組出來的數據都是字符串類型
str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
int,匹配正整數,包含0
slug,匹配字母、數字以及橫槓、下劃線組成的字符串
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
自定義轉換器 class MyCon:
regex = '[0-9]{4}'
def to_python(self,value):
return int(value)
def to_url(self,value):
return '%04d' % value
from django.urls import register_converter
register_converter(MyCon,'yyyy')
path('test/<yyy:year>', views.re_test,name='test')
當APPEND_SLASH=False 瀏覽器不會自動增長反斜槓
視圖層(view.py)
HttpResponse >>> 返回字符串
render >>> 支持模板語法,渲染頁面,並返回給前端
redirect >>> 重定向
上面的方法返回的都是HttpResponse對象
JsonResponse >>> 返回json格式的數據
FBV和CBV
FBV:基於函數的視圖
CBV:基於類的視圖
from django.views import View class Login(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
return HttpResponse('post')
文件上傳
前端注意
form表單method必須是post,enctype必須是multipart/form-data
後端接收
def upload(request):
if request == 'POST':
file_obj = request.FILES.get('myfile')
file_name = file_obj.name
with open(file_name,'wb') as f:
for line in file_obj.chunks():
f.write(line)
return render(request,'upload.html')
前臺Post傳過來的數據,包裝在POST字典中 request.POST 前臺瀏覽器窗口攜帶的數據,包裝在GET字典中 request.GET 前臺請求方式 request.method post提交的數據,body體中的內容,前臺會分裝成name=lqz&age=18 request.body 取出路徑 request.path 取出路徑和數據 request.get_full_path() 請求頭中的鍵值對 request.META