1、Django請求生命週期html
2、路由層 urls.py前端
url()方法 第一個參數其實就是一個正則表達式,一旦前面的正則匹配到了內容,就不會再往下繼續匹配,而是直接執行對應的視圖函數。python
django在路由匹配的時候,當你在瀏覽器中沒有敲最後的斜槓,mysql
django會先拿着你沒有敲斜槓的結果去匹配,若是沒有匹配上,會讓瀏覽器在末尾加斜槓再發一次請求,再去匹配一次,若是仍是匹配不上纔會報錯。git
若是你想取消該機制,不想作二次匹配能夠在seetings配置文件中設置 APPEND_SLASH = False # 該參數默認是True正則表達式
1.簡單路由配置sql
url(r'^index/$', views.index) #開頭和結尾都須要設置 ^ $
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)
3.有名分組
url(r'^index/(?P<year>\d+)/', views.index) #大寫P,year表明的是\d+正則表達式匹配的內容
def index(request,year)
注意:有名分組和無名分組不能混合使用
可是在同一種分組下,是可使用多個的
無名分組支持多個 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數據庫生成的表