Python-18-Django 基礎篇

1. Web 框架介紹

具體介紹Django以前,必須先介紹WEB框架等概念。css

Web框架:通俗地講,就是別人已經設定好的一個web網站模板,你學習它的規則,而後「填空」或「修改」成你本身須要的樣子。html

通常Web框架的架構是這樣的:
image前端

其它基於python的web框架,如tornado、flask、webpy都是在這個範圍內進行增刪裁剪的。例如tornado用的是本身的異步非阻塞「wsgi」,flask則只提供了最精簡和基本的框架。Django則是直接使用了WSGI,並實現了大部分功能。python

2. MVC/MTV 介紹

MVC:全名Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。mysql

通俗解釋:一種文件的組織和管理形式!不要被縮寫嚇到了,這其實就是把不一樣類型的文件放到不一樣的目錄下的一種方法,而後取了個高大上的名字。固然,它帶來的好處有不少,好比先後端分離,鬆耦合等等,就不詳細說明了。jquery

  • 模型(model):定義數據庫相關的內容,通常放在models.py文件中。
  • 視圖(view):定義HTML等靜態網頁文件相關,也就是那些html、css、js等前端的東西。
  • 控制器(controller):定義業務邏輯相關,就是你的主要代碼。 

MTV: 有些WEB框架以爲MVC的字面意思很彆扭,就給它改了一下。view再也不是HTML相關,而是主業務邏輯了,至關於控制器。html被放在Templates中,稱做模板,因而MVC就變成了MTV。這其實就是一個文字遊戲,和MVC本質上是同樣的,換了個名字和叫法而已,換湯不換藥。nginx

3. Django 的 MTV 模型組織

目錄分開,就必須有機制將他們在內裏進行耦合。在Django中,urls、orm、static、settings等起着重要的做用。一個典型的業務流程是以下圖所示:web

image

4. Django 基本配置

4.1 建立 django 程序

  • 終端命令:django-admin startproject sitename
  • IDE建立Django程序時,本質上都是自動執行上述命令

其餘經常使用命令:sql

  • python manage.py runserver 0.0.0.0:8001
  • python manage.py startapp appname
  • python manage.py syncdb
  • python manage.py makemigrations
  • python manage.py migrat
  • python manage.py createsuperuser

4.2 程序目錄

image

- mysite        # 對整個程序進行配置
- settings      # 配置文件
- url           # URL對應關係
- wsgi          # 遵循WSIG規範,uwsgi + nginx
- manage.py     # 管理Django程序

4.3 配置文件說明

settings.py數據庫

4.3.1 數據庫

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}

# 因爲Django內部鏈接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,因此須要使用pymysql來代替
  
# 以下設置放置的與project同名的配置的 __init__.py文件中
  
import pymysql
pymysql.install_as_MySQLdb() 

4.3.2 模板

TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]

4.3.3 靜態文件

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

4.4 路由系統

路由都在urls.py文件裏,它將瀏覽器輸入的url映射到相應的業務處理邏輯。

4.4.1 單一路由對應

url(r'^index$', views.index),

4.4.2 基於正則的路由

url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

4.4.3 添加額外的參數

url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

4.4.4 爲路由映射設置名稱

url(r'^home', views.home, name='h1'),
url(r'^index/(\d*)', views.index, name='h2'),

設置名稱以後,能夠在不一樣的地方調用,如:

  • 模板中使用生成URL: {% url 'h2' 2012 %}
  • 函數中使用生成URL: reverse('h2', args=(2012,)) 路徑:django.urls.reverse
  • Model中使用獲取URL: 自定義get_absolute_url() 方法

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

url(r'^web/',include('web.urls')),

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

經過反射機制,爲django開發一套動態的路由系統Demo:點擊下載

建立一條最簡單的路由

image

4.5 建立 APP

在每一個django項目中能夠包含多個APP,至關於一個大型項目中的分系統、子模塊、功能部件等等,相互之間比較獨立,但也有聯繫。

全部的APP共享項目資源。

在pycharm下方的terminal終端中輸入命令:

python manage.py startapp cmdb

這樣就建立了一個叫作cmdb的APP,django自動生成「cmdb」文件夾。

4.6 編寫業務邏輯

業務處理邏輯都在views.py文件裏。

image

經過上面兩個步驟,咱們將index這個url指向了views裏的index()函數,它接收用戶請求,並返回一個「hello world」字符串。

4.7 運行 Web 服務

如今咱們已經能夠將web服務運行起來了。

命令行的方式是:python manage.py runserver 127.0.0.1:8000

在pycharm中能夠直接點擊運行圖標就能夠運行起來,注意運行圖標旁要選擇整個 django 項目。

至此,一個最簡單的django編寫的web服務就啓動成功了,打開瀏覽器試一下吧。

4.7 返回 HTML 文件

一般咱們都是將html文件返回給用戶,你可使用 open 直接打開html文件讓瀏覽器去解釋,可是 django 提供了一種更好的方式避免你每次都去打開html文件,那就是render

示例:

def index(request):
    return render(request, "index.html",)

如同上面 4.3.3 所說的,render 會自動去 template 目錄裏去找html文件,若是你的html有多級目錄,你也能夠直接這樣去寫:

def index(request):
    return render(request, "cmdb/index.html",)

4.8 使用靜態文件

咱們已經能夠將html文件返還給用戶了,可是還不夠,前端三大塊,html、css、js還有各類插件,它們齊全才是一個完整的頁面。在django中,通常將靜態文件放在static目錄中。接下來,在mysite中新建個static目錄。

在index.html文件中,能夠引入css文件:

<link rel="stylesheet" href="/static/commons.css" />

也能夠引入 JS 文件:

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

爲了讓django找到這個目錄,依然須要對settings進行配置:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

4.9 接收用戶發送的數據

上面,咱們將一個要素齊全的html文件返還給了用戶瀏覽器。但這還不夠,由於web服務器和用戶之間沒有動態交互。下面咱們設計一個表單,讓用戶輸入用戶名和密碼,提交給index這個url,服務器將接收到這些數據。

先建立login.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/commons.css" />
    <style>
        label{
            width: 80px;
            text-align: right;
            display: inline-block;
        }
    </style>
</head>
<body>
    <form action="/login/" method="POST" />
        <p>
            <label for="username">用戶名:</label>
            <input id="username" name="user" type="text" />
        </p>
        <p>
            <label for="password">密碼:</label>
            <input id="password" name="pwd" type="text" />
            <input type="submit" value="提交" />
            <span style="color: red">{{ error_msg }}</span>
        </p>
    </form>
</body>
</html>

而後修改views.py文件:

def login(request):
    if request.method == "POST":
        user = request.POST.get('user',None)
        password = request.POST.get('pwd',None)
        error_msg=""
        if user == 'root' and password == '123':
            return redirect('http://www.baidu.com')
        else:
            error_msg="用戶名或密碼錯誤"
    return render(request,'login.html',{'error_msg':error_msg})

此時 ,重啓web服務時,會出錯,由於django有一個跨站請求保護機制,咱們在settings文件中將它關閉。

# 'django.middleware.csrf.CsrfViewMiddleware',

再次進入瀏覽器,刷新頁面,輸入正確的密碼和錯誤的密碼看看效果吧。

4.10 返回動態頁面

咱們收到了用戶的數據,但返回給用戶的依然是個靜態頁面,一般咱們會根據用戶的數據,進行處理後在返回給用戶。這時候,django採用本身的模板語言,相似jinja2,根據提供的數據,替換掉html中的相應部分,詳細語法入門後再深刻學習。

先改造views.py文件:

image

再改造index.html文件:

image

重啓服務,刷新瀏覽器:能夠看到,咱們得到了用戶實時輸入的數據,並將它實時展現在了用戶頁面上,這是個不錯的交互過程。

4.11 使用數據庫

流程走到這裏,django的MTV框架基本已經浮出水面了,只剩下最後的數據庫部分了。

上面咱們雖然和用戶交互得很好,但並無保存任何數據,頁面一旦關閉,或服務器重啓,一切都將回到原始狀態。

使用數據庫是毫無疑問的,django經過自帶的ORM框架操做數據庫,而且自帶輕量級的sqlite3數據庫。下面咱們來看一看:

首先是註冊app:

image

不註冊它,你的數據庫就不知道該給哪一個app建立表。

而後咱們在settings中,配置數據庫相關的參數,若是使用自帶的sqlite,不須要修改。

image

再編輯models.py文件,也就是MTV中的M。

image

這裏咱們建立了2個字段,分別保存用戶的名字和密碼。接下來要在pycharm的teminal中經過命令建立數據庫的表了。有2條命令,分別是:
python manage.py makemigrations

image

再輸入命令:python manage.py migrate

image

修改views.py中的業務邏輯

image

重啓web服務後,刷新瀏覽器頁面,以後和用戶交互的數據都能保存到數據庫中。任什麼時候候均可以從數據庫中讀取數據,展現到頁面上。

至此,一個要素齊全,主體框架展現清晰的django項目完成了!

相關文章
相關標籤/搜索