天天看點

Django架構--路由配置設定系統1、Django的路由配置設定系統2、在用戶端通過url中的 path向後端傳參數 3、路由分發4、路由别名(應用站點權限管理)

Python的WEB架構有Django、Tornado、Flask 等多種,Django相較與其他WEB架構其優勢為:大而全,架構本身內建了ORM、模型綁定、模闆引擎、緩存、Session等諸多功能。

本文将以下方面帶大家全面了解Django架構,本章使用的版本為1.11.

  1. 流程
  2. 基本配置
  3. 路由系統
  4. 視圖view
  5. 模闆
  6. Model
  7. Form
  8. 分頁
  9. Cookie
  10. Seesion
  11. admin

一、 Django流程介紹

Django架構--路由配置設定系統1、Django的路由配置設定系統2、在用戶端通過url中的 path向後端傳參數 3、路由分發4、路由别名(應用站點權限管理)

MVC是衆所周知的模式,即:将應用程式分解成三個組成部分:model(模型),view(視圖),和 controller(控制 器)。其中:

      M——管理應用程式的狀态(通常存儲到資料庫中),并限制改變狀态的行為(或者叫做“業務規則”)。

      C——接受外部使用者的操作,根據操作通路模型擷取資料,并調用“視圖”顯示這些資料。控制器是将“模型”和“視圖”隔離,并成為二者之間的聯系紐帶。

      V——負責把資料格式化後呈現給使用者。

Django也是一個MVC架構。但是在Django中,控制器接受使用者輸入的部分由架構自行處理,是以 Django 裡更關注的是模型(Model)、模闆(Template)和視圖(Views),稱為 MTV模式:

    M 代表模型(Model),即資料存取層。 該層處理與資料相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及資料之間的關系等。

    T 代表模闆(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。

    V 代表視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模闆的相關邏輯。 你可以把它看作模型與模闆之間的橋梁。

二、 Django 基本配置

1. 建立django程式

  • 終端指令:django-admin startproject sitename  (在目前目錄下建立一個Django程式)
  • IDE建立Django程式時,本質上都是自動執行上述指令

其他常用指令:

  python manage.py runserver ip:port  (啟動伺服器,預設ip和端口為http://127.0.0.1:8000/)

  python manage.py startapp appname  (建立 app)

  python manage.py makemigrations  (顯示并記錄所有資料的改動)

  python manage.py migrate  (将改動更新到資料庫)

  python manage.py createsuperuser  (建立超級管理者)

  python manage.py shell  (指令行)

  python manage.py  (檢視指令清單)

2. 程式目錄

Django架構--路由配置設定系統1、Django的路由配置設定系統2、在用戶端通過url中的 path向後端傳參數 3、路由分發4、路由别名(應用站點權限管理)

Django大緻工作流程

1、用戶端發送請求(get/post)經過web伺服器、Django中間件、 到達路由配置設定系統 

2、路由配置設定系統根據提取 request中攜帶的的url路徑(path)與視圖函數映射關系清單中,比對到1個視圖函數,foo(request)執行;

3、視圖函數 使用原生SQL或者ORM去資料庫拿到資料,在服務端進行渲染(模闆+資料渲染)

4、視圖函數return一個 response對象 傳回用戶端

3. 配置檔案

a、資料庫

支援SQLite 3(預設)、PostgreSQL 、MySQL、Oracle資料庫的操作

# 預設是SQLit 3 的配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# MySQL的配置

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',   #注意這裡的資料庫應該以utf-8編碼
    'USER': 'xxx',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}

# 對于python3的使用者們還需要再加一步操作
# 由于Django内部連接配接MySQL時使用的是MySQLdb子產品,而python3中還無此子產品,是以需要使用pymysql來代替
  
# 如下設定放置的與project同名的配置的 __init__.py檔案中
  
import pymysql
pymysql.install_as_MySQLdb()


# PostgreSQL配置
DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'XXX',
        'PASSWORD': 'XXX'
    }


# Oracle配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'xe',
        'USER': 'a_user',
        'PASSWORD': 'a_password',
        'HOST': '',
        'PORT': '',
    }
}      

資料庫配置資訊

Django架構對于開發者而言高度透明化,對于不同資料庫的具體使用方法是一緻的,改變資料庫類型隻需要變動上述配置即可。

想要了解更多請戳這裡

b、靜态檔案添加

# 首先在項目根目錄下建立static目錄

# 接着在settings.py 檔案下添加

STATIC_URL = '/static/'  # 預設已添加,使用靜态檔案時的字首
STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'), #行末的逗号不能漏
    )

# 這樣在template中就可以導入static目錄下的靜态檔案啦

# 例:
<script src="/static/jquery-1.12.4.js"></script>      

三、 Django 路由系統

Django路由配置設定系統簡介

Django project目錄中的urls.py檔案中, 以Python [ (   )  ]的資料類型記錄了可以通路到該站點的url 和 視圖函數一一對應關系表,當request請求到達路由系統,Django通過request中攜帶的path 周遊這個關系表,比對到對應的視圖函數,break;(是以1個 url 隻能從路由關系表中自上而下比對到1個視圖函數)

1、Django的路由配置設定系統

      1個URL對應1個視圖函數

from django.conf.urls import url
from django.contrib import admin
from APP import view
urlpatterns = [
    url(r'^modal/',view.modal),         url(r'^域名',對應的處理函數) 注意不要忘了寫 ^ 表示正則比對以。。開頭的URL
    url(r'^modal_add/',view.modal_add),
    url(r'^modal_del/',view.modal_del),
    url(r'^modal_edit/',view.modal_edit),
    ]      

2、在用戶端通過url中的 path向後端傳參數 

 在前端我們不僅可以通過get請求攜帶參數的方式向server端傳資料; https://i.cnblogs.com/%EF%BC%9Fid=1&name=alex

Django也允許通過,path路徑的方式向server端傳值;

注意事項:按位置,和按關鍵字路由系統隻能用1種,不能混合使用;

1)、path正則無名分組比對《---------》視圖函數按位置傳參

from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
    url(r'^index/(\w+)/(\w+)/',views.index2),  #醬紫的話用戶端 輸入:http://127.0.0.1:8000/index/a/b/也可以通路到該站點
    url(r'^',views.error)
        ]

urlpatterns = [
    url(r'^/',index),                   #視圖函數 index(request)
    url(r'^(\d{4})/\d{2}/$',timeer1),   #視圖函數 timeer1(request,實參1)       正則增加了分組,視圖函數會增加一個參數;
    url(r'^(\d{4})/(\d{2)/$',timeer2)   #視圖函數 timeer2(request,實參1,實參2)  視圖函數需要2個形參接收;
    # url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',timeer),      

在路由系統定義了 幾個正則分組(),在視圖函數對應幾個實參接收;

def timeer2(request,a1,a2):

    print(a1,a2)  #列印參數a1,a2 就是 2個正規表達式比對到的結果
  return Httprespose('ok')

#注意如果按位置傳參的動态路由系統,必須在視圖函數添加對應的參數接收!      

2)、path正則有名分組比對《---------》視圖函數按關鍵字傳參

按位置傳參形參或實參錯位會導緻資料錯亂,是以Django路由分發系統還可以以命名分組的形式比對URL給視圖函數按關鍵字傳參;

from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
 url(r'^index/(P<n1>\w+)/(P<n2>\w+)/',views.index,name="zhanggen"),

 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',timeer),

url(r'^',views.error), ] #注意如果在路由系統正則内部定義了關鍵字n1,n2,視圖函數接收參數也必須是 n1,n2;

urlpatterns = [
    # url(r'^/',index),                                   #index(request)
    # url(r'^(\d{4})/\d{2}/$',timeer),                    #timeer(request,2014) 正則增加了分組,視圖函數會增加一個參數;
    # url(r'^(\d{4})/(\d{2)/$',timeer1) ,                 #timeer(request,2014,12) 視圖函數需要兩個形參接收
    url(r'^(?P<year>\d{4})/$(?P<month>\d{2})',timeer2)    #timeer(request,year=2017,month=6) 正則設定了有名分組,視圖函數使用關鍵字傳參
]      

在視圖函數定義2個關鍵字參數, 接收 2個正規表達式比對到的字尾;

def index(request,n1,n2):
    print(n1,n2)  #注意必須和 路由系統中的一緻
    return  HttpResponse('OK')      

3)、URL path傳值應用

有了動态路由就 可以不用在  url?nid=8這樣傳值了!

PS:

終止符:^edit$  可以精确限制比對URL的字尾内容

僞靜态:url(r'^edit/(\w+).html$', views.edit)  裝作成靜态網站的url可以 提高 SEO高權重   百度排名靠前

url(r'^student_del/(.*).html/',views.student_del),      
<a href="/student_del/{{row.id}}.html/">删除</a></td>      
def student_del(request,args1):
    return HttpResponse('nihao')      

3、路由分發

1個Django 項目裡面有多個APP目錄大家共有一個 url容易造成混淆,于是路由分發讓每個APP的擁有了自己單獨的url;

from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
     url(r'^app1/',include('app1.urls')),
     url(r'^app2/',include('app2.urls')),  #注意include的是字元串形式的 檔案路徑;
     url(r'^',views.error),
                     
                     ]      

醬紫就可以在每個 Django目錄下面寫自己的 URL了

Django架構--路由配置設定系統1、Django的路由配置設定系統2、在用戶端通過url中的 path向後端傳參數 3、路由分發4、路由别名(應用站點權限管理)

4、路由别名(應用站點權限管理)

1)、什麼是路由别名?

給Django路由分發系統 URL--視圖函數對應關系命個名,

然後在模闆中{% url "zhanggen" i i1%}反生成 通路該站點URL,

或者在視圖函數中reverse()反向生産目前通路URL;

2)、作用

保證前後端資料一緻性,後端修改了比對URL,不用在前段更改;

from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
    url(r'^index/(?P<n1>\w+)/(?P<n2>\w+)/',views.index,name="alex"), 給這個URL起别名 alex
    url(r'^',views.error),
             ]      

在視圖函數使用 reverse("别名", args=(1, 2)) 反生 位置參數動态路由的 别名

def index(request,n1,n2):
    print(reverse("zhanggen", args=(1, 2)))
    return render(request,'index.html',{'i':1,'i1':2})      

在視圖函數使用 reverse("别名",kwargs={"關鍵字參數":1,"關鍵字參數":2 }反生 關鍵字參數動态路由的 别名

def index(request,n1,n2):
    print(reverse("zhanggen",kwargs={"n1":1,"n2":2 }))
    return render(request,'index.html',{'i':1,'i1':2})      

在模闆中反生 URL

注意 在視圖函數中  return render(request,'index.html',{'i':1,'i1':2})

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>{{ i }}</p>
<p>{% url "zhanggen" i i1%}</p>
</body>
</html>      

轉載于:https://www.cnblogs.com/wu-chao/p/8285022.html