具體介紹Django以前,必須先介紹WEB框架等概念。css
Web框架:通俗地講,就是別人已經設定好的一個web網站模板,你學習它的規則,而後「填空」或「修改」成你本身須要的樣子。html
通常Web框架的架構是這樣的:
前端
其它基於python的web框架,如tornado、flask、webpy都是在這個範圍內進行增刪裁剪的。例如tornado用的是本身的異步非阻塞「wsgi」,flask則只提供了最精簡和基本的框架。Django則是直接使用了WSGI,並實現了大部分功能。python
MVC:全名Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。mysql
通俗解釋:一種文件的組織和管理形式!不要被縮寫嚇到了,這其實就是把不一樣類型的文件放到不一樣的目錄下的一種方法,而後取了個高大上的名字。固然,它帶來的好處有不少,好比先後端分離,鬆耦合等等,就不詳細說明了。jquery
MTV: 有些WEB框架以爲MVC的字面意思很彆扭,就給它改了一下。view再也不是HTML相關,而是主業務邏輯了,至關於控制器。html被放在Templates中,稱做模板,因而MVC就變成了MTV。這其實就是一個文字遊戲,和MVC本質上是同樣的,換了個名字和叫法而已,換湯不換藥。nginx
目錄分開,就必須有機制將他們在內裏進行耦合。在Django中,urls、orm、static、settings等起着重要的做用。一個典型的業務流程是以下圖所示:web
其餘經常使用命令:sql
- mysite # 對整個程序進行配置 - settings # 配置文件 - url # URL對應關係 - wsgi # 遵循WSIG規範,uwsgi + nginx - manage.py # 管理Django程序
settings.py數據庫
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()
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', ], }, }, ]
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
路由都在urls.py
文件裏,它將瀏覽器輸入的url映射到相應的業務處理邏輯。
url(r'^index$', views.index),
url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),
url(r'^home', views.home, name='h1'), url(r'^index/(\d*)', views.index, name='h2'),
設置名稱以後,能夠在不一樣的地方調用,如:
url(r'^web/',include('web.urls')),
django中的路由系統和其餘語言的框架有所不一樣,在django中每個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其餘大部分的Web框架則是對一類的url請求作一條路由映射,從而是路由系統變得簡潔。
經過反射機制,爲django開發一套動態的路由系統Demo:點擊下載
在每一個django項目中能夠包含多個APP,至關於一個大型項目中的分系統、子模塊、功能部件等等,相互之間比較獨立,但也有聯繫。
全部的APP共享項目資源。
在pycharm下方的terminal終端中輸入命令:
python manage.py startapp cmdb
這樣就建立了一個叫作cmdb的APP,django自動生成「cmdb」文件夾。
業務處理邏輯都在views.py
文件裏。
經過上面兩個步驟,咱們將index這個url指向了views裏的index()函數,它接收用戶請求,並返回一個「hello world」字符串。
如今咱們已經能夠將web服務運行起來了。
命令行的方式是:python manage.py runserver 127.0.0.1:8000
在pycharm中能夠直接點擊運行圖標就能夠運行起來,注意運行圖標旁要選擇整個 django 項目。
至此,一個最簡單的django編寫的web服務就啓動成功了,打開瀏覽器試一下吧。
一般咱們都是將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",)
咱們已經能夠將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"), )
上面,咱們將一個要素齊全的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',
再次進入瀏覽器,刷新頁面,輸入正確的密碼和錯誤的密碼看看效果吧。
咱們收到了用戶的數據,但返回給用戶的依然是個靜態頁面,一般咱們會根據用戶的數據,進行處理後在返回給用戶。這時候,django採用本身的模板語言,相似jinja2,根據提供的數據,替換掉html中的相應部分,詳細語法入門後再深刻學習。
先改造views.py文件:
再改造index.html文件:
重啓服務,刷新瀏覽器:能夠看到,咱們得到了用戶實時輸入的數據,並將它實時展現在了用戶頁面上,這是個不錯的交互過程。
流程走到這裏,django的MTV框架基本已經浮出水面了,只剩下最後的數據庫部分了。
上面咱們雖然和用戶交互得很好,但並無保存任何數據,頁面一旦關閉,或服務器重啓,一切都將回到原始狀態。
使用數據庫是毫無疑問的,django經過自帶的ORM框架操做數據庫,而且自帶輕量級的sqlite3數據庫。下面咱們來看一看:
首先是註冊app:
不註冊它,你的數據庫就不知道該給哪一個app建立表。
而後咱們在settings中,配置數據庫相關的參數,若是使用自帶的sqlite,不須要修改。
再編輯models.py文件,也就是MTV中的M。
這裏咱們建立了2個字段,分別保存用戶的名字和密碼。接下來要在pycharm的teminal中經過命令建立數據庫的表了。有2條命令,分別是:
python manage.py makemigrations
再輸入命令:python manage.py migrate
修改views.py中的業務邏輯
重啓web服務後,刷新瀏覽器頁面,以後和用戶交互的數據都能保存到數據庫中。任什麼時候候均可以從數據庫中讀取數據,展現到頁面上。
至此,一個要素齊全,主體框架展現清晰的django項目完成了!