django之路由層(反向解析)總結

表關係的創建方式
表與表之間的關係就三種
一對一 OneToOne(to='') # to後面能夠跟字符串的表名 也能夠直接跟變量名錶名(該表名必須在上面提早定義出來)
一對多 ForeignKey(to='')
多對多 ManyToMany(to='')
本身必定要會三種關係的推導步驟 以及建表的注意事項前端

一對一和多對多外鍵字段 建在哪一方均可以 可是推薦你建在查詢頻率較高的一方 以便後續的orm查詢
        一對多外鍵字段 建在多的那一方
        
        一對一和一對多外鍵字段 在建立表的時候回自動加_id後綴 不管你有沒有加
        
        多對多字段不會在表中建立出來 只是用來告訴orm自動幫你建立第三張表
        可以方便後續orm查詢操做   

django請求生命週期流程圖
    

路由層
    url方法第一個參數是一個正則表達式
    匹配的特色:只要正則表達式可以匹配到內容 那麼會馬上結束匹配 直接執行後面所對應的視圖函數
    正是因爲該特色會出現,當你的項目特別龐大的時候 可能會出現url被頂替的現象(test testadd)
    若是出現上述狀況
        1.修改正則表達式
        2.將下面的放到上面去
    
    django在路由匹配的時候默認有一個補救機制
    當你的url沒有正常匹配到 django會讓瀏覽器自動加斜槓再來匹配一次(重定向)
    配置文件中有一個參數用來控制該機制是否容許
    APPEND_SLASH = True/False
        
    網站首頁能夠使用的匹配方式
    # 網站首頁
    url(r'^$',home),
    # 網站404頁面的設計(瞭解)
    url(r'',error)
    
    
    
路由匹配

無名分組
    給正則表達式加括號分組 在路由匹配成功以後調用視圖函數的時候
    會將括號內正則表達式匹配到的內容當作位置參數傳遞給視圖函數
    url(r'^index/(\d+)/',index)   # index(request,\d+內容)

有名分組
    給正則表達式加括號分組並起別名 在路由匹配成功以後調用視圖函數的時候
    會將括號內正則表達式匹配到的內容當作關鍵字傳遞給視圖函數
    url(r'^index/(?P<year>\d+)/',index)   # index(request,year=\d+內容)

    注意事項 無名有名不能混合
    可是單個狀況下 能夠使用屢次
    
反向解析
    本質:根據別名 動態解析出一個結果 該結果能夠直接訪問到別名所對應的url
    沒有正則表達式符號
        url(r'^index/',views.index,name='xxx')
        
        前端
            {% url 'xxx' %}  # index/
        後端
            from django.shortcuts import reverse
            reverse('xxx')  # index/
    出現正則表達式符號
        # 無名分組
        url(r'^index/(\d+)/',views.login,name='yyy')
        # index/數字/
        前端
            {% url 'yyy' 數字 %}  # index/數字/
        後端
            reverse('xxx',args=(數字,))
            # 只要是容器類型 內部就算只有一個元素 你也給我習慣性的把分隔符逗號加上
            
        # 有名分組
            # 你能夠直接使用無名分組的方式便可
            前端
            {% url 'yyy' 名字=數字 %}  # index/數字/
        後端
            reverse('xxx',keargs={'名字':數字})

路由分發
    前提
        全部的app均可以有本身獨立的urls.py templates模板文件夾 static靜態文件夾
        正是因爲該特色 使得基於django實現多人開發 很是的方便
        每一個人只須要開發本身的app便可 
    
    路由分發
        總路由再也不直接作路由與視圖函數對應關係了
        而是僅僅作一個轉發的功能
        好處:更加的解耦合 更加好維護
        from django.conf.urls import url,include
        
        url(r'^應用名1/',include('應用名1.urls'))
        url(r'^應用名2/',include('應用名2.urls')) 

名稱空間
    當不一樣的應用中給路由與視圖對應關係起了相同的別名
    在反向解析的時候 並不能直接識別到是哪一個應用下的
    url(r'^應用名1/',include('應用名1.urls',namespace='應用名'))
    
    {% url '應用名1:相同的別名' %}
    {% url '應用名2:相同的別名' %}
    
    reverse('應用名1:相同的別名')
    reverse('應用名2:相同的別名')
    
    # 其實你徹底能夠不適用名稱空間
    # 你只須要保證在起別名的時候不要出現衝突便可 建議作法就是加 應用前綴_別名

虛擬環境
    給每個項目提供一個專門屬於該項目本身的所需模塊
    避免浪費 節省資源
    requirement.txt
        django==1.11.11
        Flask==1.4
    建議不要頻繁的開設虛擬環境
    
django版本區別
    path與url
    path第一個參數不支持正則 若是你還想使用正則 你能夠re_path跟你的url如出一轍
    
    path雖然不支持正則 可是提供了五個默認的轉換器 可以自動幫你轉換數據類型
    
    還支持用戶自定義轉換器(不要記憶 直接拷貝便可)

request方法獲取文件數據
    request.FILES  獲取form表單上傳的文件數據
    
    file_obj = request.FILES.get('myfile')
    file_obj.name  文件名
    
    f = open(file.obj.name,'wb')
    for chunk in file_obj.chunks():  # for line in file_obj:
        f.write(chunk)
    f.close()
相關文章
相關標籤/搜索