1. 程式人生 > >Django基礎之MTV模型

Django基礎之MTV模型

site media pytho 工程 abc 同步數據 num 例如 7月

一、Django基礎

一、Django簡介

  Django是一個開放源代碼的Web應用框架,由Python寫成。采用了MVC的軟件設計模式,即模型(Model)、視圖(View)和控制器(Controller)。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟件。並於2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。

  1、mvc簡介

  http://blog.csdn.net/pi9nc/article/details/18822325

  • Model:封裝領域數據及邏輯。用於管理應用程序域的行為和數據,並響應為獲取其狀態信息(通常來自視圖)而發出的請求,還會響應更改狀態的指令(通常來自控制器)。

  • View:查詢領域數據並展現給用戶。用於管理信息的顯示。

  • Conctroller:截獲用戶請求並改變領域數據。用於解釋用戶的鼠標和鍵盤輸入,以通知模型和/或視圖進行相應的更改。

  技術分享圖片

  2、MTV模式簡介

  Django是一個基於MVC構造的框架。但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 裏更關註的是模型(Model)、模板(Template)和視圖(Views),稱為 MTV模式。它們各自的職責如下:

  模型(Model),即數據存取層

  處理與數據相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及數據之間的關系等。

  模板(Template),即表現層

  處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。

  視圖(View),即業務邏輯層

  存取模型及調取恰當模板的相關邏輯。模型與模板之間的橋梁。

此外,Django還有一個urls分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template

技術分享圖片

  3、MTV模型的基本結構

│  db.sqlite3 ----------sqlie3數據庫
│  manage.py        
│      
├─logres
│  │  admin.py          後臺,可以用很少量的代碼就擁有一個強大的後臺。
│  │  apps.py
│  │  models.py         與數據庫操作相關,存入或讀取數據時用到這個
│  │  tests.py
│  │  urls.py
│  │  views.py  
│  │  處理用戶發出的請求,從urls.py中對應過來, 通過渲染templates中的網頁可以將顯示
│  │      內容比如登陸後的用戶名,用戶請求的數據,輸出到網頁。
│  │  
__init__.py │ │ │ ├─migrations │ │ 0001_initial.py │ │ __init__.py │ │ │ │ ├─Mushishi │ │ settings.py Django 的設置,配置文件,比如 DEBUG 的開關,靜態文件的位置等 │ │ urls.py urls.py │ │ 網址入口,關聯到對應的views.py中的一個函數(或者generic類), │ │ 訪問網址就對應一個函數。 │ │ wsgi.py wsgi有多重一種uwsgi和wsgi,你用那種wsgi來運行Django, 一般不用改只有你用到的時候在改 │ │ __init__.py │ │ ├─static └─templates templates中的Html模板, index.html login.html regist.html

二、安裝Django

1.window 使用pycharm安裝
    過程略
2.window上使用pip安裝 
    pip install django               ##安裝最新版本
    pip install django==1.11         ##安裝指定的版本
3.linux下使用pip安裝
    yum install python-pip
    pip install django               ##安裝最新版本
    pip install django==1.11         ##安裝指定的版本
4.檢查是否安裝成功
>>> import django
>>> django.VERSION

三、Django基本命令

  1、創建django命令

django-admin.py startproject project-name(你工程的名字)

  當前目錄下會生成mysite的工程,目錄結構如下

  技術分享圖片 

  1. manage.py ----- Django項目裏面的工具,通過它可以調用django shell和數據庫等。
  2. settings.py ---- 包含了項目的默認設置,包括數據庫信息,調試標誌以及其他一些工作的變量。
  3. urls.py ----- 負責把URL模式映射到應用程序。

  2、創建django的app

python manage.py startapp app-name(你app的名字)
或 django-admin.py startapp app-name(你app的名字)

  技術分享圖片

  3、調試模式,啟動項目

python manage.py runserver 8080
#監聽所有可用 ip (電腦可能有一個或多個內網ip,一個或多個外網ip,即有多個ip地址)
python manage.py runserver 0.0.0.0:8000

  這樣我們的django就啟動起來了!當我們訪問:http://127.0.0.1:8080/時就可以看到:

技術分享圖片

  4、同步數據庫

python manage.py syncdb
註意:Django 1.7.1及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

  這種方法可以創建表,當你在models.py中新增了類時,運行它就可以自動在數據庫中創建表了,不用手動創建。

  5、清除數據庫

python manage.py flush

  此命令會詢問是 yes 還是 no, 選擇 yes 會把數據全部清空掉,只留下空表。

  6、創建超級管理員

python manage.py createsuperuser
# 按照提示輸入用戶名和對應的密碼就好了郵箱可以留空,用戶名和密碼必填
按照提示就ok

修改管理員密碼
python manage.py changepassword username(你當時設定的用戶名)

  7、導入和導出數據

python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json

  8、Django項目終端

python manage.py shell

  這個命令和 直接運行 python 進入 shell 的區別是:你可以在這個 shell 裏面調用當前項目的 models.py 中的 API,對於操作數據的測試非常方便。

  9、Django項目環境終端

python manage.py dbshell

  Django 會自動進入在settings.py中設置的數據庫,如果是 MySQL 或 postgreSQL,會要求輸入數據庫用戶密碼。

在這個終端可以執行數據庫的SQL語句。如果您對SQL比較熟悉,可能喜歡這種方式。

  10、查看幫助信息

python manage.py

  查看所有的命令,忘記子名稱的時候特別有用。

  11、靜態文件配置

概述:
     靜態文件交由Web服務器處理,Django本身不處理靜態文件。簡單的處理邏輯如下(以nginx為例):

              URI請求-----> 按照Web服務器裏面的配置規則先處理,以nginx為例,主要求配置在nginx.
                             conf裏的location

                         |---------->如果是靜態文件,則由nginx直接處理

                         |---------->如果不是則交由Django處理,Django根據urls.py裏面的規則進行匹配

    以上是部署到Web服務器後的處理方式,為了便於開發,Django提供了在開發環境的對靜態文件的處理機制,方法是這樣:

  static配置:

STATIC主要指的是如css,js,images這樣文件:

STATIC_URL = /static/      # 別名
STATICFILES_DIRS = (
            os.path.join(BASE_DIR,"static"),  #實際名 ,即實際文件夾的名字
        )

註意點1:
 django對引用名和實際名進行映射,引用時,只能按照引用名來,不能按實際名去找
        <script src="/statics/jquery-3.1.1.js"></script>
        ------error-----不能直接用,必須用STATIC_URL = /static/:
        <script src="/static/jquery-3.1.1.js"></script>

註意點2:
 STATICFILES_DIRS = (
    ("app01",os.path.join(BASE_DIR, "app01/statics")),
        )

 <script src="/static/app01/jquery.js"></script>

  media配置:

# in settings:

MEDIA_URL="/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","upload")

# in urls:
from django.views.static import serve
url(r^media/(?P<path>.*)$, serve, {document_root: settings.MEDIA_ROOT}),

  訪問測試:http://127.0.0.1:8080/media/1.png

技術分享圖片
‘‘‘
        靜態文件的處理又包括STATIC和MEDIA兩類,這往往容易混淆,在Django裏面是這樣定義的:
        
        MEDIA:指用戶上傳的文件,比如在Model裏面的FileFIeld,ImageField上傳的文件。如果你定義
        
        MEDIA_ROOT=c:\temp\media,那麽File=models.FileField(upload_to="abc/")#,上傳的文件就會被保存到c:\temp\media\abc

        eg:
            class blog(models.Model):
                   Title=models.charField(max_length=64)
                   Photo=models.ImageField(upload_to="photo")
          上傳的圖片就上傳到c:\temp\media\photo,而在模板中要顯示該文件,則在這樣寫
          在settings裏面設置的MEDIA_ROOT必須是本地路徑的絕對路徑,一般是這樣寫:
                 BASE_DIR= os.path.abspath(os.path.dirname(__file__))
                 MEDIA_ROOT=os.path.join(BASE_DIR,‘media/‘).replace(‘\\‘,‘/‘)

        MEDIA_URL是指從瀏覽器訪問時的地址前綴,舉個例子:
            MEDIA_ROOT=c:\temp\media\photo
            MEDIA_URL="/data/"
        在開發階段,media的處理由django處理:

           訪問http://localhost/data/abc/a.png就是訪問c:\temp\media\photo\abc\a.png

           在模板裏面這樣寫<img src="/media/abc/a.png">

           在部署階段最大的不同在於你必須讓web服務器來處理media文件,因此你必須在web服務器中配置,
           以便能讓web服務器能訪問media文件
           以nginx為例,可以在nginx.conf裏面這樣:

                 location ~/media/{
                       root/temp/
                       break;
                    }

           具體可以參考如何在nginx部署django的資料。
           
           
           ‘‘‘
View Code

二、Django項目實戰

  註:此環境在window環境下使用pycharm進行的

一、創建一個project工程和app

  1、pycharm創建項目

  技術分享圖片

  2、project和APP概念

  Project是一個大的工程,

  下面有很多功能:(一個Project有多個App,其實他就是對你大的工程的一個分類)

  例如一個運維平臺是一個工程,那麽他的app就是CMDB,監控系統,OA系統,

  3、生成數據庫 創建超級管理員用戶

  註:此步驟是在pycharm的終端裏使用命令實現的

1.同步數據庫
python manage.py makemigrations
python manage.py migrate
本人使用的是django1.9.5版本
2.創建超級管理員
python manage.py createsuperuser
3.運行django
python manage.py runserver 8000

  瀏覽器訪問: http://127.0.0.1:8000/admin/

  3、路由

  首先在helloword文件夾下(不是app目錄,千萬別寫錯)的urls.py填寫路由規則

from django.conf.urls import url
from django.contrib import admin
#導入app下的view函數
from helloapp import  views
urlpatterns = [
url(r^admin/, admin.site.urls),
#當用戶訪問http://127.0.0.1:端口號的時候之間交給helloapp下面的views裏的index函數來處理
url(r^$, views.index),
]

  4、views函數

  在helloapp(app)下面的views裏寫一個index函數

#Django 在返回的時候需要一層封裝,需要導入HttpResponse
from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
     #使用HttpRespons 封裝返回信息
    return HttpResponse(<h1>hello world!!!</h1>)

  django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其他大部分的Web框架則是對一類的url請求做一條路由映射,從而是路由系統變得簡潔。

  如果要返回html頁面

在templates裏創建index.html頁面
內容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello world!!</h1>
</body>
</html>
2.修改helloapp裏的views.py的index函數

from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
# return HttpResponse(‘<h1>hello world!!!</h1>‘)
return  render(request,index.html)
#找到index.html
#讀取index.html返回給用戶

  python manage.py runserver 8000

  使用瀏覽器訪問:http://127.0.0.1:8000

二、Django路由系統

  在Django的urls中我們可以根據一個URL對應一個函數名來定義路由規則如下:

  每一個urls對應一個views裏的函數

  1、基本的urls對應

urlpatterns = [
url(r^login/$, views.login),
url(r^index/$, views.index),
url(r^$, views.login),
]

  2、基於app的路由

  根據app對路由規則進行一次分類

  當app的urls很多的時候,那麽就不能再工程的urls下面去設置,應該這樣設置:

    1、首先在helloword下面的urls這樣設置
#導入include
from django.conf.urls import url,include
from django.contrib import admin
#導入app下的view函數
from helloapp import  views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    #使用helloapp的urls規則
    url(r^helloapp/,include(helloapp/urls))

]
    2、在helloapp下面創建一個urls.py
from django.conf.urls import url,include
from django.contrib import admin
#導入app下的view函數
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^login/,views.login),
    url(r^index/,views.index),
    url(r^reg/,views.reg),
    url(r^layout/,views.layout),
]
    3、在helloapp下面的views裏創建上面urls對應的函數
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
    # return HttpResponse(‘<h1>hello world!!!</h1 >‘)
    return  render(request,index.html)
def login(request):
    return HttpResponse(login)
def reg(request):
    return HttpResponse(reg)
def layout(request):
    return HttpResponse(layout)
    4、訪問測試
http://127.0.0.1:8000/helloapp/admin/ admin後臺管理
http://127.0.0.1:8000/helloapp/layout/
http://127.0.0.1:8000/helloapp/login/
http://127.0.0.1:8000/helloapp/reg/
http://127.0.0.1:8000/helloapp/index/

  3、動態路由(傳一個參數)

  比如分頁:當urls大量過多的時候比如幾百個的時候,那麽肯定不會去寫幾百個路由規則
  所有這個時候就需要動態urls,使用正則表達式來完成

    1、在helloapp下面的urls寫入以下內容:
from django.conf.urls import url,include
from django.contrib import admin
#導入app下的view函數
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^book/(\d+)$, views.book), //正則匹配
]
    2、在helloapp下面的views寫入以下內容:
from django.shortcuts import render,HttpResponse
# Create your views here.
def book(request,num):
    print(num)
    return HttpResponse(num)
當用戶訪問http://127.0.0.1:8000/helloapp/book/數字的時候
django會在自動把參數傳給views裏的book函數
    3、測試訪問:
http://127.0.0.1:8000/helloapp/book/2

顯示2

http://127.0.0.1:8000/helloapp/book/1

顯示1

  4、動態路由(傳多個參數)

  多個參數它是已/來分割的

  來一個url的加法

    1、在helloapp下面的urls寫入以下內容:
from django.conf.urls import url,include
from django.contrib import admin
#導入app下的view函數
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^book/(\d+)/(\d+)$, views.book),
]
    2、在helloapp下面的views寫入以下內容:
def book(request,num1,num2):
    print(num1,num2)
    num = int(num1) + int(num2)
    return HttpResponse(num)
    3、測試訪問:
http://127.0.0.1:8000/helloapp/book/2/1
顯示3
http://127.0.0.1:8000/helloapp/book/2/10
顯示12

  他的順序是:正序的,你先給他傳那個值,第一個參數就是那個

  5、動態的路由(Key:value的形式)

    1、在helloapp下面的urls寫入以下內容:
from django.conf.urls import url,include
from django.contrib import admin
#導入app下的view函數
from . import views
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^book/(?P<k1>\d+)/(?P<k2>\d+)$, views.book),
    這裏?p<v1>這裏的v1就是key,vlaue就是傳進去的值,
]
    2、在helloapp下面的views寫入以下內容:
from django.shortcuts import render,HttpResponse
# Create your views here.
def book(request,k1,k2):
    print(k1,k2)
    return HttpResponse(k1+k2)

  這樣我們就不必按照順序去取了,可以通過key,value的方式來取傳進來的值

  註:可以根據傳來的值來進行判斷返回給用戶指定的url,過程略。

  6、基於反射的動態路由

僅僅是通過反射來實現的,通過文件找到裏面的函數然後執行!
但是在Django中不建議使用此方法。因為不同的WEB框架建議你使用不同的方式,
Django就不建議使用反射

Django基礎之MTV模型