人生苦短,我用python-- Day19 django架構之URL路由系統、視圖應用、模板應用、django之orm應用

來源:互聯網
上載者:User

標籤:提交   code   補充   doctype   patch   create   前台   files   pre   

目錄                    

一、django的URL應用

二、django的視圖應用

三、django的模板應用

四、django的orm應用

  補充:

補充一:getlis

  應用情境:當前端發送的資料為多個的時候,後台如果還用get擷取資料,那麼就會出問題,所以這裡有一個getlist方法進行資料的擷取。

  實驗案例:當前端有一個多選的checkbox的時候,那麼就要使用getlist進行擷取資料了

urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^getlist‘, views.getlist),]
urls.py
def getlist(request):    if request.method == ‘GET‘:        return render(request,‘getlist.html‘)    else:        checkbox = request.POST.getlist(‘interest‘)        print(checkbox)        return HttpResponse(checkbox)
views.py
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><form action="/getlist" method="post">    <div>        興趣愛好調查問卷    </div>    <span>男</span>    <input type="checkbox" name="interest" value="1">    <span>女</span>    <input type="checkbox" name="interest" value="2">    <span>無要求</span>    <input type="checkbox" name="interest" value="3">    <input type="submit" value="提交"></form></body></html>
html代碼

查看結果:

同樣select標籤的使用方法也是一樣的

補充二:上傳檔案

  學過了從前台擷取資料(單個的資料、多個的資料),那如何從前台擷取一個檔案呢?這裡要說一下擷取檔案就不能用request.POST進行get了,

需要使用request.FILES進行資料擷取了。

寫一個上傳檔案的案例:

urlpatterns = [    url(r‘^admin/‘, admin.site.urls),    url(r‘^upload/‘, views.upload),]
urls.py
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>{#  enctype="multipart/form-data"如果提交的資料是檔案的話,那麼就得在form表單裡面寫上這句話  #}    <form action="/upload/" method="POST" enctype="multipart/form-data">         <p>            <input type="file" name="file"/>        </p>        <input type="submit" value="提交"/>    </form></body></html>
html代碼
from django.shortcuts import render,HttpResponsefrom django.views import View# Create your views here.def upload(request):    if request.method == ‘GET‘:        return render(request,‘upload.html‘)    elif request.method == ‘POST‘:        # 擷取到前台傳過來的檔案,如果直接print obj的話,會列印上傳檔案的檔案名稱;        # 其實他接收到的並不是一個檔案名稱,可以列印一些obj的類型,結果是一個類的對象        obj = request.FILES.get(‘file‘)        import os        # 在obj.name前面加上一個upload目錄 最後目錄路徑是 upload/上傳的檔案名稱字        # 這裡的obj.name就是調用name屬性,屬性值為上傳的檔案名稱字        file_pat = os.path.join(‘upload‘,obj.name)        f = open(file_pat,‘wb‘)        print(os.path)        # 迴圈擷取上傳的資料        for i in obj.chunks():            f.write(i)        f.close()        return render(request,‘upload.html‘)    else:        return render(request,‘upload.html‘)
Views.py主邏輯 django的URL應用                           

 

django的視圖應用                    

FBV (funaction base view) ---->  我們之前學的url路由關係都是一個請求過來由url進行匹配,看匹配到那個方法直接去views.py代碼體裡面進行相應發方法尋找,然後進行邏輯處理。 

CBV (Class base view) -----> 現在說一個cbv的模式,模式是這樣,當請求過來後,也是由url進行匹配,這次匹配到的不是一個方法,而是一個類。

那麼CBV是怎麼工作的呢? 看代碼:

urlpatterns = [    url(r‘^admin/‘, admin.site.urls),   #FBV    url(r‘^home/‘, views.Home.as_view()),  #CBV]
urls.py
from django.shortcuts import render,HttpResponsefrom django.views import View   #引入一個django裡面View模組# 定義這類class Home(View):    # 這裡是利用類的映射進行操作的,可以看一下父類View裡面有一個dispatch方法。當使用get請求的時候    # 就會執行下面的get方法。。。    def get(self,request):        print(request.method)        return render(request,‘home.html‘)    def post(self,request):        print(request.method)        return render(request,‘home.html‘)
Views.py

django一共給我們提供了這麼多的請求方式,我們來梳理一下過程:

也就是說,在執行我們定義的方法之前肯定會先執行父類裡面的dispatch方法,那麼既然這樣,我們就可以搞點事情了。想想“裝飾器”,看代碼:

class Home(View):    def dispatch(self,request,*args,**kwargs):        print(‘befor‘)        result = super(Home,self).dispatch(request,*args,**kwargs)        print(‘after‘)        return result    # 這裡是利用類的映射進行操作的,可以看一下父類View裡面有一個dispatch方法。當使用get請求的時候    # 就會執行下面的get方法。。。    def get(self,request):        print(request.method)        return render(request,‘home.html‘)    def post(self,request):        print(request.method)        return render(request,‘home.html‘)
views.py

這裡列印的befor和after是不是就類似於我們我們之前學的裝飾器呢?

我們再來梳理一下現在的流程:

第一步:瀏覽器通過任何方式的請求把資料包發送到伺服器的urls路由系統中

第二步:urls路由系統進行匹配請求的url,發現匹配到一個class,把請求轉給對應的class

第三步:對應的class在自己內部找到dispatch方法,首先執行自己增加的代碼塊

第四步:從整合的父親那裡擷取該請求是什麼方式的請求

第五步:父類告訴子類請求的方式是什麼

第六步:子類尋找自己內部對應的請求方方式的function並執行代碼塊,並把資料返回給瀏覽器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

人生苦短,我用python-- Day19 django架構之URL路由系統、視圖應用、模板應用、django之orm應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.