Django(三)---django生命週期,路由層

[TOC]html

Django(三) django生命週期,路由層

orm表關係如何創建

#先導入django中的models模塊
from django.db import models

#先不考慮外鍵關係,建立基表
class Book(models.Model):
    titile = models.CharField(max_length = 32) #CharField字段必定要設置max_length
    #小數總共八位,小數點後佔兩位
    price = models.DecimalField(max_digits=8,decimal_places=2)
    # to用來指代跟哪張表有關係 默認關聯的就是表的主鍵字段
    publish_id = models.ForeignKey(to='Publish')
    '''
    一對多外鍵字段,同步到數據中心後,表字段會自動加_id後綴
    若是手動加上_id,同步以後,仍是會自動加上另外一個_id
    '''
    #書和做者是多對多的關係,外鍵字段能夠建在任意一方,通常建在查詢頻率高的一方
    #django orm會自動建立書籍和做者的第三張關係表
    #author該字段是一個虛擬字段,不能在表中展現出來,僅是起到一個高速orm,在建第三張表的關係起到做用
    author = models.ManytoManyField(to='Author')
    
class Publish(models.Model):
    title = models.CharField(max_length=32)
    email = models.EmailField()

class Author(models.Model):
    name = models.CharField(max_length=32)
    email = models.EmailField()
    #一對一的表關係,外鍵字段建在任意一方均可以,通常建在查詢頻率高的一方
	author_detail = models.OneToOneField(to='Author_detail')
    
class Author_detail(models.Model):
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

django請求生命週期流程圖

urls.py路由層

url的第一個參數是一個正則表達式,只要是該正則表達式可以匹配到內容,就會馬上執行後面的視圖韓式,而再也不往下繼續匹配了前端

from django.conf.urls import url

urlpatterns = [
     url(正則表達式, views視圖函數,參數,別名),
]

路由匹配

#不加斜槓,會先匹配一次,若是匹配不上,Django可讓瀏覽器在url後自動加斜槓
#取消該功能
APPEND_SLASH = False  # 該參數默認是True

無名分組

#將分組內正則表達式匹配到的內容當作位置參數傳遞給視圖函數
url(r'^test/([0-9]{4})/', views.test)

#當路由中有分組的正則表達式,在匹配到內容,執行視圖函數的時候,會將分組內正則表達式匹配的把內容當作位置參數傳給視圖函數

有名分組

會將分組內的正則表達式匹配到的內容當作關鍵字參數傳遞給視圖函數python

#語法
url(r'^testadd/(?P<year>\d+)',views.testadd)
    
# 當你的路由中有分組而且給分組起了別名 那麼在匹配內容的時候
# 會將分組內的正則表達式匹配到的內容當作關鍵字參數傳遞給視圖函數  testadd(request,year=分組內的正則表達式匹配到的內容)

有名分組和無名分組不能混合使用!mysql

反向解析

根據別名,動態解析出一個結果,該結果能夠直接訪問對應的urlgit

第一種狀況

#路由中沒有正則表達式 直接是寫死的
url(r'^home/', views.home,name='xxx'),  # 給路由與視圖函數對應關係起別名

#前端反向解析
{% url 'xxx' %}

#後端反向解析
from django.shortcuts import reverse
url = reverse('xxx')

第二種狀況

#無名分組的反向解析 在解析的時候 你須要手動指定正則匹配的內容是什麼
url(r'^home/(\d+)/', views.home,name='xxx'),  # 給路由與視圖函數對應關係起別名

#前端反向解析
    <p><a href="{% url 'xxx' 12 %}">111</a></p>
    <p><a href="{% url 'xxx' 1324 %}">111</a></p>
    <p><a href="{% url 'xxx' 14324 %}">111</a></p>
    <p><a href="{% url 'xxx' 1234 %}">111</a></p>

#後端反向解析
        url = reverse('xxx',args=(1,))
        url1 = reverse('xxx',args=(3213,))
        url2 = reverse('xxx',args=(2132131,))
# 手動傳入的參數 只須要知足可以被正則表達式匹配到便可

第三種狀況

#有名分組的反向解析 在解析的時候 你須要手動指定正則匹配的內容是什麼
#有名分組的反向解析能夠跟無名分組同樣
#可是最最正規的寫法
url(r'^home/(?P<year>\d+)/', views.home,name='xxx'),  # 給路由與視圖函數對應關係起別名

#前端
    # 能夠直接用無名分組的狀況
    <p><a href="{% url 'xxx' 12 %}">111</a></p>
    # 你也能夠規範寫法
    <p><a href="{% url 'xxx' year=1232 %}">111</a></p>  # 瞭解便可

#後端
    # 能夠直接用無名分組的狀況
    url = reverse('xxx',args=(1,))
    # 你也能夠規範寫法
    url = reverse('xxx',kwargs={'year':213123})
#以編輯功能爲例
    url(r'^edit_user/(\d+)/',views.edit_user,name='edit')
    
    def edit_user(request,edit_id):
        # edit_id就是用戶想要編輯數據主鍵值
        pass
    
    {% for user_obj in user_list %}
    <a href='/edit_user/{{user_obj.id}}/'>編輯</a>
    <a href='{% url 'edit' user_obj.id %}'>編輯</a>
    {% endfor %}

路由分發

路由分發的前因:正則表達式

​ 在django中全部的app均可以有本身獨立的urls.py templates staticsql

路由分發解決的就是項目的總路由匹配關係過多的狀況數據庫

​ 使用路由分發,會將總路由再也不作匹配的活,而僅僅是作任務分發(請求來了以後,總路由不作對應關係)只詢問你要訪問哪一個app的功能 而後將請求轉發給對應的app去處理django

urlpatterns = [
    url(r'^admin/', admin.site.urls),  # url第一個參數是一個正則表達式
    # 路由分發
    url(r'^app01/',include(app01_urls)),  # 路由分發須要注意的實現 就是總路由裏面不能以$結尾
    url(r'^app02/',include(app02_urls)),
]

# 子路由
from django.conf.urls import url
from app01 import views


urlpatterns = [
   url('^reg/',views.reg)
]


from django.conf.urls import url
from app02 import views


urlpatterns = [
   url('^reg/',views.reg)
]

#最省事的寫法(******)
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))

名稱空間

​ 當多個app中出現了起別名衝突的狀況,在作路由分發的時候,能夠給每個app建立一個名稱空間,而後在反向解析的時候,能夠選擇到底去哪一個名稱空間中查找別名後端

url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
    
# 後端
print(reverse('app01:reg'))
print(reverse('app02:reg'))
# 前端
<a href="{% url 'app01:reg' %}"></a>
<a href="{% url 'app02:reg' %}"></a>

#使用名稱空間會開闢內存資源,佔空間
#其實上面的名稱空間知識點能夠徹底不用,你只須要保證起別名的時候 在整個django項目中不衝突便可
起別名的時候統一加上應用名前綴
urlpatterns = [
   url(r'^reg/',views.reg,name='app02_reg')
]
            
urlpatterns = [
   url('^reg/',views.reg,name='app01_reg')
]

僞靜態

將一個動態網頁假裝成一個靜態網頁 以此來挺好搜索引擎SEO查詢頻率和蒐藏力度

所謂的搜索引擎其實就是一個也別巨大的爬蟲程序

url(r'^app01.html',include('app01.urls')),

虛擬環境

給每個項目 裝備該項目所須要的模塊 不須要的模塊一律不裝

​ 每建立一個虛擬環境就相似於你從新下載了一個純淨python解釋器 以後該項目用到上面 你就裝什麼(虛擬環境一臺機器上能夠有N多個)

django版本區別

urls.py中路由匹配的方法有區別
django2.X用的是path
    urlpatterns = [
        path('admin/', admin.site.urls),
    ]
django1.X用的是url
    urlpatterns = [
        url(r'^reg.html',views.reg,name='app02_reg')
    ]
# 區別 django2.X裏面path第一個參數不是正則也不支持正則 寫什麼就匹配什麼
# 雖然path不支持正則 感受也好用 django2.X還有一個re_path的方法 該方法就是你django1.X裏面url

# 雖然path支持 可是它提供了五種轉換器  可以將匹配到的數據自動轉黃成對應的類型

# 除了有默認五種轉換器以外 還支持你自定義轉換器

涉及知識點梳理

mysql數據庫之表與表之間的關係

一對多

foreign key

外鍵約束

1. 在建立表的時候,必須先建立被關聯表
2. 插入數據的時候,也必須先插入被關聯表的數據

如員工表和部門表之間就是一對多的關係,一般將關鍵字段稱之爲外鍵字段

外鍵建在多的一方

多對多

以圖書表和做者表舉例(換位思考)

1. 先站在圖書表:多本書可否是一個做者
2. 站在做者表中:多個做者可否共同編寫一本書

若是雙方都成立,那麼就是多對多

多對多關係的創建,必須手動建立第三張表,專門用來記錄兩種表之間的關係

一對一

一對一關係對較少,通常當表特別龐大時,能夠拆分表

好比客戶信息,與詳細信息表

外鍵字段能夠建在任意一方,通常建在查詢頻率高的一方

re模塊(正則表達式)

re模塊:去字符串找符合某種特色的字符串

import re

s = 'abcdabc'
#^ :以...開頭
res = re.findall('^ab',s)

#$ :以...結尾
res = re.findall('bc$',s)

# . :任意字符
res = re.findall('abc',s)

# \d :數字
res = re.findall('\d',s)

# \w :非空,數字字母下劃線
res = re.findall('\w',s)

# \s :空,空格
res = re.findall('\s',s)

# \D:非數字
res = re.findall('\D',s)

# \W:空
res = re.findall('\W',s)

#\S :非空
res = re.findall('\S',s)

# + :前面的一個字符至少一個
print(re.findall('abc+',s))

# ? :尋找到?前面的一個字符 0-1 個
print(re.findall('abcdd?', s))

# * :前面的一個字符至少0個
print(re.findall('abcd*',s))

# [] :中括號內的均可以
print(re.findall('[abc]bc',s))

# [^] :中括號內的都不能夠
print(re.findall('[^abc]bc',s))

# | : 或
print(re.findall('abc|bbc',s))

# {2}:前面的字符  2個
print(re,findall('abc{2}',s))

# {1,2} :前面的字符 2 個
print(re,findall('abc{1,2}',s))

#貪婪模式
# .(任意字符) * (0-無窮個)
print(re.findall('a.*g',s))

#非貪婪模式
# . (任意字符) * (0-無窮個)
print(re,findall('a.*?g',s))

#bug  # . (任意字符) * (0-無窮個)
print(re.findall('.*?',s))
相關文章
相關標籤/搜索