Django框架之第三篇(路由層)--有名/無名分組、反向解析、路由分發、名稱空間、僞靜態、圖書管理系統表設計

1、Django請求生命週期html

 2、路由層  urls.py前端

url()方法 第一個參數其實就是一個正則表達式,一旦前面的正則匹配到了內容,就不會再往下繼續匹配,而是直接執行對應的視圖函數。python

django在路由匹配的時候,當你在瀏覽器中沒有敲最後的斜槓,mysql

django會先拿着你沒有敲斜槓的結果去匹配,若是沒有匹配上,會讓瀏覽器在末尾加斜槓再發一次請求,再去匹配一次,若是仍是匹配不上纔會報錯。git

若是你想取消該機制,不想作二次匹配能夠在seetings配置文件中設置   APPEND_SLASH = False  # 該參數默認是True正則表達式

1.簡單路由配置sql

url(r'^index/$', views.index)     #開頭和結尾都須要設置 ^ $
  • 第一個參數是正則表達式,第二個參數是視圖函數(跳轉到哪一個視圖函數)
  • 每一個正則表達式前面的'r'是可選的,可是建議加上,取消轉義
url(r'index/', views.index) 

若是不加^和$,因爲路由匹配是從上往下的,如果輸入其餘路徑裏面包含index,也是會被匹配到的數據庫

首頁路徑匹配不能這樣寫,這樣寫會把全部的都匹配到django

 

url(r'', views.home)   #404頁面配置,寫在最後一行

 

應該是用正則形式寫,這樣直接輸入ip和端口號就能訪問到首頁後端

url(r'^$', views.home)   #首頁配置

 

 

2.無名分組

url(r'^index/(\d+)/', views.index)   #必定要記得寫括號

def index(request,xxx) 或者 def index(request,*args)
  • 按位置傳參
  • ()表示分組,路由匹配的時候,會將()正則表達式匹配到的內容當作位置參數傳遞給視圖函數
  • views視圖函數必需要位置參數接收分組出來的數據,這個參數名能夠隨便取(這裏用xxx接收(\d+)),當分組出來的數據不少時,也能夠用*args用一個元組接收全部數據

 

3.有名分組

url(r'^index/(?P<year>\d+)/', views.index)   #大寫P,year表明的是\d+正則表達式匹配的內容

def index(request,year)
  • 按關鍵字傳參
  • 路由匹配的時候,會將括號內的正則表達式匹配到的內容,當作關鍵字參數傳遞給視圖函數
  • views視圖函數接收的的參數名必需要和url傳遞的參數名一致,否則就會報錯。(year接收url傳遞的數字)

 注意:有名分組和無名分組不能混合使用

可是在同一種分組下,是可使用多個的

無名分組支持多個
url(r'^test/(\d+)/(\d+)/', views.test),
有名分組支持多個
url(r'^test/(?P<year>\d+)/(?P<xx>\d+)/', views.test),

3、反向解

本質:其實就是給你返回一個可以訪問對應的url的地址。

普通反向解析,無參

1.先給url和視圖函數對應關係起別名(name就是起別名)

url(r'^test/', views.test),
url(r'^testadd/', views.testadd,name='aaa')

2.反向解析

  後端反向解析 視圖層

  後端能夠在任意位置經過reverse反向解析出對應的url(就是經過別名name得出對應的url)

from django.shortcuts import render,HttpResponse,redirect,reverse
print(reverse('aaa')) #aaa是別名,打印testadd

  

  前端反向解析 模板層

<a href="{% url 'aaa' %}">1</a>  

無名分組反向解析(無名分組+反向解析)

也是先起別名name

url(r'^index/(\d+)/$',views.index,name='kkk')

後端反向解析 視圖層

reverse('kkk',args=(1,))  #後面的數字一般都是數據的id值

前端反向解析 模板層

{% url 'kkk' 1%}   #後面的數字一般都是數據的id值

有名分組反向解析

同無名分組反向解析同樣的用法

先起別名

url(r'^index/(?P<year>\d+)/$',views.index,name='kkk')

後端反向解析

print(reverse('kkk',args=(1,)))  # 推薦你使用上面這種  減小你的腦容量消耗
或者
print
(reverse('kkk',kwargs={'year':1}))

前端反向解析

<a href="{% url 'kkk' 1 %}">1</a>  # 推薦你使用上面這種  減小你的腦容量消耗
或者
<a href="{% url 'kkk' year=1 %}">1</a>

注意:在同一應用下,別名千萬不能重複(******)

4、路由分發  include  (針對存在多個app)

當你的django項目特別龐大的時候 路由與視圖函數對應關係特別特別多,那麼你的總路由urls.py代碼太過冗長 不易維護
每個應用均可以有本身的urls.py,static文件夾,templates文件夾(******)

正是基於上述條件 能夠實現多人分組開發 等多人開發完成以後 咱們只須要建立一個空的django項目
而後將多人開發的app所有註冊進來 在總路由實現一個路由分發 而再也不作路由匹配(來了以後 我只給你分發到對應的app中)

from django.conf.urls import url,include
urlpatterns = [
            url(r'^admin/', admin.site.urls),
            url(r'^app01/',include('app01.urls')),
            url(r'^app02/',include('app02.urls')),
        ]
總路由中,一級路由後面千萬不要加$符號

5、名稱空間(瞭解)

多個app內路由起了相同的別名,這個時候用反向解析,並不會自動識別應用前綴

有兩種方式:

方式1:

總路由

url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))

後端解析:

reverse('app01:index')  #名稱空間:別名
reverse('app02:index')

前端解析:

{% url 'app01:index' %}  #名稱空間:別名
{% url 'app02:index' %}

方式2:

起別名的時候不要衝突,通常狀況下在起別名的時候一般建議以應用名做爲前綴

  name ='app01_index'

6、僞靜態

靜態網頁:數據是寫死的 萬年不變
        
僞靜態網頁的設計是爲了增長百度等搜索引擎seo查詢力度
        
全部的搜索引擎其實都是一個巨大的爬蟲程序
        
網站優化相關  經過僞靜態確實能夠提升你的網站被查詢出來的機率
可是再怎麼優化也抵不過RMB玩家
#路由,用html結尾
url(r'^book.html/',views.book)

虛擬環境

通常狀況下 咱們會給每個項目 配備該項目所須要的模塊 不須要的一律不裝
虛擬環境 就相似於爲每一個項目量身定作的解釋器環境
        
        
如何建立虛擬環境
  每建立一個虛擬環境 就相似於你又下載了一個全新的python解釋器

django版本的區別

django1.X跟django2.X版本區別
     路由層1.X用的是url
     而2.X用的是path 2.X中的path第一個參數再也不是正則表達式,而是寫什麼就匹配什麼 是精準匹配
            
     當你使用2.X不習慣的時候  2.X還有一個叫re_path 2.x中的re_path就是你1.X的url
雖然2.X中path不支持正則表達式  可是它提供了五種默認的轉換器
        
            1.0版本的url和2.0版本的re_path分組出來的數據都是字符串類型
            默認有五個轉換器,感興趣的本身能夠課下去試一下
            str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
            int,匹配正整數,包含0。
            slug,匹配字母、數字以及橫槓、下劃線組成的字符串。
            uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
            path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
  path('index/<int:id>/',index)  # 會將id匹配到的內容自動轉換成整型
還支持自定義轉換器
            class FourDigitYearConverter:  
            regex = '[0-9]{4}'  
            def to_python(self, value):  
                return int(value)  
            def to_url(self, value):  
                return '%04d' % value  佔四位,不夠用0填滿,超了則就按超了的位數來!
            register_converter(FourDigitYearConverter, 'yyyy')  
            
            urlpatterns = [  
                    path('articles/2003/', views.special_case_2003),  
                    path('articles/<yyyy:year>/', views.year_archive),  
                    ...  
                ] 

圖書管理系統表設計

三張表:圖書表,出版社表,做者表

圖書表和出版社表是一對多,圖書表和做者表是多對多

一對多: Foreignkey   一對一:OneToOneField     多對多:ManyToManyField

 

 

mysql數據庫生成的表

相關文章
相關標籤/搜索