1 - django-介紹-MTV-命令-基礎配置-admin

1 什麼是web框架

        衆所周知,全部的Web應用基本都是基於B/S結構,其本質上其實就是一個socket服務端(web服務器),一個socket客戶端(用戶瀏覽器)。下面的代碼就是一個簡單的web端,運行後,使用瀏覽器訪問,會打印hello worldhtml

#!/usr/bin/env python
#_*_coding:utf-8_*_
    
import socket
    
def handle_request(client):
    buf = client.recv(1024)
    client.send(b"HTTP/1.1 200 OK\r\n\r\n")
    client.send(b"Hello, world")
    
def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8000))
    sock.listen(5)
    
    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()
    
if __name__ == '__main__':
    main()

        上述代碼經過socket實現了web服務端的本質,而對於真實開發中的Python Web程序來講,通常會分爲兩部分:服務器程序和應用程序。前端

  • 服務器程序負責對socket服務器進行封裝,並在請求到來時,對請求的各類數據進行整理。
  • 應用程序則負責具體的邏輯處理。

        爲了方便應用程序的開發,就出現了衆多的Web框架,例如:Django、Flask、web.py 等。不一樣的框架有不一樣的開發方式,可是不管如何,開發出的應用程序都要和服務器程序配合,才能爲用戶提供服務。這樣,服務器程序就須要爲不一樣的框架提供不一樣的支持。這樣混亂的局面不管對於服務器仍是框架,都是很差的。對服務器來講,須要支持各類不一樣框架,對框架來講,只有支持它的服務器才能被開發出的應用使用。這時候,標準化就變得尤其重要。咱們能夠設立一個標準,只要服務器程序支持這個標準,框架也支持這個標準,那麼他們就能夠配合使用。一旦標準肯定,雙方各自實現。這樣,服務器能夠支持更多支持標準的框架,框架也可使用更多支持標準的服務器。python

2 WSGI

        WSGI全稱爲:The Python Web Server Gateway Interface,單從名字來看就是一種網關,而網關的做用就是在協議之間進行轉換。
        WSGI是爲 Python 語言定義的 Web 服務器和 Web 應用程序或框架之間的一種簡單而通用的接口,是一種規範,定義了使用Python編寫的Web app與Web server之間接口格式,實現web app與web server間的解耦。mysql

Python標準庫提供的獨立WSGI服務器稱爲wsgiref。nginx

# 利用wsgiref完成上面簡單的web服務程序
 
from wsgiref.simple_server import make_server
  
def RunServer(environ, start_response):                         # environ 存放的是用戶訪問時提交的信息,包涵http header等
    start_response('200 OK', [('Content-Type', 'text/html')])   # 構建http response頭部信息
    return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]  # 返回給用戶的信息,注意是 bytes 格式。
  
if __name__ == '__main__':
    httpd = make_server('', 8000, RunServer)       # 啓動一個服務,監聽8000端口,請求進來交給RunServer函數處理
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()                          # 啓動服務開始接受請求

3 MVC與MTV模式

說到web開發,就須要遵循必定的開發模式。著名的MVC/MTV模式,其本質是使各組件之間保持鬆耦合關係。web

3.1 MVC框架

MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計建立 Web 應用程序的模式正則表達式

  • Model(模型)表示應用程序核心(好比數據庫記錄列表)
  • View(視圖)顯示數據(數據庫記錄)
  • Controller(控制器)處理輸入(寫入數據庫記錄)

MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的徹底控制。sql

  • Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。一般模型對象負責在數據庫中存取數據。
  • View(視圖)是應用程序中處理數據顯示的部分。一般視圖是依據模型數據建立的前端網頁。
  • Controller(控制器)是應用程序中處理用戶交互的部分。一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據映射,模式渲染等。

3.2 MTV框架

MTV是一種使用MTV(Model Templates Views 模型-模版-視圖)設計建立 Web 應用程序的模式數據庫

  • Model(模型):負責業務對象與數據庫的對象(ORM)
  • Template(模版):負責如何把頁面展現給用戶
  • View(視圖):負責業務邏輯,並在適當的時候調用Model和Template

此外,Django還有一個url分發器,它的做用是將一個個URL的頁面請求分發給不一樣的view處理,view再調用相應的Model和Template,邏輯處理以下:
mtv

3.3 區別

        MVC即模型-視圖-控制器模式,就是爲那些須要爲一樣的數據提供多個視圖的應用程序而設計的。它很好地實現了數據層與表示層的分離,特別適用於開發與用戶圖形界面有關的應用程序。控制器用來處理用戶命令以及程序事件;模型維護數據並提供數據訪問方法;視圖用於數據的顯示。
        MTV即模型-模版-視圖模式,其標準名稱是有爭議的。在MVC的解釋中,視圖描述了展示給用戶的數據,是指所看到的數據,而不是如何看見它。在python中視圖是指對某一特定URL的回調函數,由於回調函數描述了所要展示的數據。模版用於將內容與展示分離。在django中,視圖描述了要展示的數據,而視圖通常轉交給模版。模版描述了數據如何展示。控制器則是指django框架自己,經過URL配置,系統將一個請求發送到一個合適的視圖。

4 django介紹

        Django是重量級選手中最有表明性的一位。許多成功的網站和APP都基於Django。是一個開放源代碼的Web應用框架,由Python寫成。遵照BSD版權,初次發佈於2005年7月, 並於2008年9月發佈了第一個正式版本1.0 。

本次選擇djang 1.11.20 版本,進行學習

4.1 Django處理順序

Django是標準的MTV框架。

  • wsgi:socket請求處理
  • 控制器(django框架自己):控制用戶輸入,url匹配,經過映射列表將一個請求發送到一個合適的視圖;
  • views --Views:python程序,向模型和模板發送(或獲取)數據;
  • 模型綁定 --Model:數據庫存取數據
  • 模板引擎 --Templates:用於將內容與展示分離,描述了數據如何展示(如網頁模板);
  • 模式渲染 --Views:將模板和數據整合,造成最終網頁;
  • 控制器(django框架自己):返回用戶展現。

4.2 建立django站點

下面使用django建立服務端站點,並顯示hello world頁面信息。

4.2.1 安裝Django

使用命令行執行以下命令進行安裝

pip3 install Django==1.11.20

注意:會安裝在python安裝目錄的scripts目錄下。針對多環境的狀況下,使用哪一個解釋器安裝,那麼就會安裝在哪一個版本下。安裝完畢後會在scripts下產生一個django-admin.py文件,利用該文件能夠在命令行下建立一個Django項目。

4.2.2 建立一個project

django-admin.py startproject PEOJECTNAME

建立完畢後:會產生PROJECTNAME命名的文件夾,裏面包含 PROJECTNAME 目錄 和 manager.py文件。
其中:

  • manager.py 用來管理咱們項目相關的全部命令的文件(好比應用建立、數據庫遷移等)
  • PROJECTNAME:存放此項目全局的相關文件
    • settings.py:項目的配置信息文件
    • urls.py:把用戶發過來的url經過urls文件來過濾(控制),交給某個view函數來處理 -->控制器
    • wsgi.py:處理socket相關的任務(類nginx/apache的功能) --> 一個 WSGI 兼容的 Web 服務器的入口,以便運行你的項目。 生產上通常不會使用wsgi(第三方模塊),通常會使用uwsgi + nginx 來運行。

4.2.3 建立一個app

python manage.py startapp APPNAME

        爲何一個項目裏要建立一個應用?舉個例子:微信是一個項目,那麼通信錄,錢包,朋友圈就是一個個相互獨立功能,這裏叫作應用。一個項目是全部應用的集合。
        建立一個應用以後會產生同名目錄,目錄下的主要文件功能以下:

  • models.py:MTV框架,存放和數據進行操做的代碼
  • admin.py:django的數據庫後臺管理工具
  • views.py:MTV框架,包含全部的視圖函數,由urls.py 來選擇發送給具體哪一個view函數
  • test.py:用來測試的

        views.py 中的函數:必定是來根據用戶輸入的內容來返回一個具體的頁面,wsgi模塊用來負責HTTP協議的解析,而後放在views視圖函數中,做爲一個固定的參數(request)使用。

4.2.3 啓動Django項目

python manage.py runserver PORT

啓動一個web應用服務,並監聽8800端口,這樣就啓動了一個django項目了,但這是咱們測試時的啓動方式,生產上不會這麼用。

4.3 Django 版的 hello world

下面來實現一個站點,當咱們訪問時,輸出hello world信息

4.3.1 定義URL選擇器

        定義url選擇器是爲了能在用戶輸入url的時候把對應的url映射到指定的views函數中去處理,因此urls.py會存放在項目全局的目錄下。

# urls.py文件

from blog import views   # blog爲項目名,導入views模塊
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$',views.index),          # 就能夠表示首頁
]

url的參數:

  • 第一個參數是正則表達式
  • 第二個參數表示匹配後,要觸發的函數或者類

4.3.2 定義views函數

        通過項目的urls控制,那麼請求將會分配給具體的應用(函數)來處理,因此須要在應用的目錄中的views.py文件中進行添加。因爲咱們返回的是靜態頁面,不須要進行數據庫相關的處理,因此在index函數內,能夠直接返回頁面給客戶端。
這裏有兩種方式:

  • 直接返回html標籤
  • 返回html文件

返回html標籤:

# blog/models.py

from django.shortcuts import HttpResponse
 
def index(request):
 
    return HttpResponse('<h1>hello world</h1>')<br>
 
# 注意:用戶的請求經由wsgi處理後,會返回一個對象標識,通常這裏使用request來接受這個對象。
 
# HttpResponse 用戶對客戶的相應
  • request:請求信息對象
  • HttpResponse:響應信息對象

返回html文件:
全部的html文件是由Templates來進行處理的,因此須要如今Templates目錄下建立要返回的html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>

對應的models.py修改成

from django.shortcuts import render,HttpResponse
 
def index(request):
 
    return render(request,'index.html')
 
# render,的第一個參數就是request,標識把後面的index文件返回給這個request

答覆的html文件,render會去Templates下尋找,由於在setting.py文件中已經定義了Templates的路徑

4.3.3 啓動服務

在項目目錄下執行

python manage.py runserver 8080

啓動完畢後,使用瀏覽器訪問。

http://127.0.0.1:8080

4.4 基礎配置

爲了使咱們的項目依賴的文件放在特定的地方提供訪問,那麼咱們在建立完項目還須要作一些基礎的配置。

4.4.1 配置靜態文件存放路徑

        靜態文件:好比css,js文件都是要提供給用戶進行下載的,因此咱們通常規定靜態文件,存放在django項目的一級子目錄static中,須要手動建立這個目錄,而後作以下配置。

# 修改settings.py文件
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),    # 添加靜態文件路徑
)

4.4.2 配置模板路徑

        用來集中存放用於返回給用戶的模板文件(若是是利用pycharm建立的項目,它會自動幫咱們建立template目錄,並自動進行關聯),建立templates目錄(一樣存放在django項目的一級子目錄下)。

# 修改settings.py文件
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]     # 添加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.4.3 關閉csrftoken

csrftoken用於防止csrf攻擊,csrf的相關配置將在後面進行說明,因此這裏能夠先關閉csrftoken。

# 修改settings.py文件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',      #  註釋掉csrf中間件便可(須要重啓django項目)
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

4.4.4 鏈接數據庫

django支持MySQL 5.5+ 官方建議使用mysqlclient 1.3.7+ 來驅動,因此這裏須要先安裝

pip install myclient

web站點最重要的數據庫鏈接配置,須要在settings.py中設置所鏈接的數據庫。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 引擎
        'NAME': 'blog',    # 庫名
        'USER': 'dahl',    # 數據庫用戶名
        'PASSWORD': '123456',  # 數據庫密碼
        'HOST': '127.0.0.1',   # 數據庫地址
        'PORT': '3306',        # 數據庫端口
    }
}

支持的數據庫引擎有:

'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'

更多的配置方法參考:https://docs.djangoproject.com/en/1.11/ref/settings/#databases

若是安裝mysqlclient失敗,提示缺乏C++,那麼不建議安裝全部的編譯環境,由於即使是安裝因此,可能沒法編譯成功,因此能夠在一下網站中直接查找現成的whl包。https://www.lfd.uci.edu/~gohlke/pythonlibs/

4.5 django admin配置

Django 提供了基於 web 的管理工具即django-admin,它能夠經過web頁面來管理咱們項目中的表,但前提是你已經把表註冊給admin管轄了。

默認狀況下,django-admin是隨django一塊兒安裝的,要使用它,還須要通過如下步驟:

4.5.1 建立django-admin用戶

在項目根目錄下執行

python manage.py createsuperuser

按照提示建立django-admin的管理用戶

4.5.2 初始化django-admin須要的表

django-admin須要一些表來處理admin後臺的登陸、認證等信息,因此咱們須要在數據庫中把這些表建立。django的自帶的orm能夠幫咱們完成這項操做,若是你的項目須要建立表,那麼請首先確保項目的配置文件settings.py中的INSTALLAPP列表中包含你的應用名稱

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user'  # 這個就是咱們的應用名稱,注意它的路徑是從項目的頂級目錄開始的
]

項目本身的models中須要自行編寫數據庫表的映射類,django-admin的映射類已經內置。

執行以下命令生成遷移文件

python manage.py makemigrations

執行完畢後,會在項目目錄下生成migrations目錄,裏面存放的是因此的遷移記錄,不要隨意刪除。

執行以下命令完成表遷移(在數據庫中建立)

python manage.py migrate

當咱們對models.py中的映射類結構進行修改時,那麼每次都須要進行上述兩步操做

注意:

  1. 要建立的表的應用必須在INSTALLED_APPS中註冊。
  2. 不要隨便刪除migrations下的遷移文件。

4.5.3 本地化配置(可選)

默認狀況下django-admin的後臺管理是英文的,能夠在settings.py文件中修改成中文顯示

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

4.5.4 註冊應用模塊

若是想要django-admin管理項目本身的表信息,那麼須要將表註冊給django-admin,那麼就須要在應用目錄下的admin.py中進行以下操做

from django.contrib import admin
from user.models import User  # 導入models.py中要被管理的類

# Register your models here.

admin.site.register(User) # 註冊給amdin

附User表:(models.py中)

class User(models.Model):
    class Meta:
        db_table = 'user'

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=48, null=False)
    email = models.CharField(max_length=64, unique=True, null=False)
    password = models.CharField(max_length=128, null=False)

    def __repr__(self):
        return '<User {} {}>'.format(self.id, self.name)

4.5.5 啓動django

這時,從新啓動django,那麼就能夠訪問admin了。(項目根目錄下)

python manage.py runserver 8080

在瀏覽器中輸入127.0.0.1:8080/admim 輸入剛剛建立的superuser便可。

相關文章
相關標籤/搜索