1. 程式人生 > >搭建django開發環境

搭建django開發環境

                  python  Django教程  之 安裝、基本命令、檢視與網站

一、簡介

Django 中提供了開發網站經常用到的模組,常見的程式碼都為你寫好了,通過減少重複的程式碼,Django 使你能夠專注於 web 應用上有 趣的關鍵性的東西。為了達到這個目標,Django 提供了通用Web開發模式的高度抽象,提供了頻繁進行的程式設計作業的快速解決方法,以及為“如何解決問題”提供了清晰明瞭的約定。Django的理念是DRY(Don't Repeat Yourself)來鼓勵快速開發!

讓我們一覽 Django 全貌

網址入口,關聯到對應的views.py中的一個函式(或者generic類),訪問網址就對應一個函式。

處理使用者發出的請求,從urls.py中對應過來, 通過渲染templates中的網頁可以將顯示內容,比如登陸後的使用者名稱,使用者請求的資料,輸出到網頁。

與資料庫操作相關,存入或讀取資料時用到這個,當然用不到資料庫的時候 你可以不使用。

表單,使用者在瀏覽器上輸入資料提交,對資料的驗證工作以及輸入框的生成等工作,當然你也可以不使用。

templates 資料夾

views.py 中的函式渲染templates中的Html模板,得到動態內容的網頁,當然可以用快取來提高速度。

後臺,可以用很少量的程式碼就擁有一個強大的後臺。

Django 的設定,配置檔案,比如 DEBUG 的開關,靜態檔案的位置等。

二、安裝

在安裝Django之前,系統上必須已經安裝了Python,至於如何安裝Python,這裡就不多講了

安裝好Python之後,建議安裝easy_install,這樣直接使用命令easy_install django即可下載最新版本,非常方便。

注意:以下方法中任何一種方法安裝都可,不用每個都試一次。

另外 建議自行安裝 bpython,這樣在用起來會爽很多。進入終端的時候輸入 bpython 可以有提示。當然也可以選擇用 ipython

一. 用 pip 來安裝

2.1 需要先安裝pip

(1). ubuntu: 

sudo apt-get install python-pip

(2). RedHat

yum install python-pip

或者直接下載:get-pip.py 然後執行在終端執行 python get-pip.py 就可以安裝 pip。

Note: 也可以下載 pip 原始碼包,執行 python setup.py install 進行安裝

2.2 利用 pip 安裝 Django

(sudo) pip install Django 或者 (sudo) pip install Django==1.6.10 或者 pip install Django==1.7.6

如果想升級 pip 可以用:

(sudo) pip install --upgrade pip

Windows 使用者不要加 sudo,如果提示 ‘python’不是內部或外部命令,也不是可執行的程式或批處理檔案。

那說明你的 Python 沒有安裝好,或者環境變數沒有配置正確,最簡單的辦法是安裝新版本的 Python 2.7.9, 裡面集成了 pip,安裝時要勾選上環境變數這一個

二. 下載原始碼安裝

如果是原始碼包, 比如 django-1.7.6.tar.gz

3.1 Linux 或 Mac 下

tar -xvzf django-1.7.6.tar.gz
cd django-1.7.6
(sudo) python setup.py install

3.2 Windows 下

直接用解壓軟體解壓,然後到命令列(XP/Win7點選開始,在下面的那個輸入框中輸入 cmd, Win8在開始那裡點右鍵,選擇命令列)

比如在 D:\django-1.7.6\  這個資料夾下

cd D:
cd django-1.7.6
python setup.py install

什麼?提示 ‘python’不是內部或外部命令,也不是可執行的程式或批處理檔案。

那說明你的 Python 沒有安裝好,或者路徑沒有配置正確

 Linux用自帶源進行安裝

1.1  ubuntu 下安裝 Django

sudo apt-get install python-django -y

1.2  redhat 下安裝用 yum

yum install python-django

注意:自帶源安裝的 Django 一般版本比較舊,而用 pip 可以安裝最新的版本。

2. 檢查是否安裝成功

終端上輸入 python ,點選 Enter,進行 python 環境

1 >>> import django
2 >>> django.VERSION
3 (1, 7, 6, 'final', 0)
4 >>> 
5 >>> django.get_version()
6 '1.7.6'

如果執行後看到版本號,就證明安裝成功了!

3. 擴充套件:搭建多個互不干擾的開發環境

我們有的時候會發現,一個電腦上有多個專案,一個依賴 Django 1.8,另一個比較舊的專案又要用 Django 1.5,這時候怎麼辦呢?

我們需要一個依賴包管理的工具來處理不同的環境。

如果不想搭建這個環境,只想用某一個版本的 Django 也可以,但是推薦學習此內容!

3.1 環境搭建

開發會用 virtualenv 來管理多個開發環境,virtualenvwrapper 使得virtualenv變得更好用

# 安裝:
(sudo) pip install virtualenv virtualenvwrapper

Linux/Mac OSX 下:

修改~/.bash_profile或其它環境變數相關檔案(如 .bashrc 或用 ZSH 之後的 .zshrc),新增以下語句

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh

修改後使之立即生效(也可以重啟終端使之生效):

source ~/.bash_profile

Windows 下:

pip install virtualenvwrapper-win

可選】Windows下預設虛擬環境是放在使用者名稱下面的Envs中的,與桌面,我的文件,下載等資料夾在一塊的。更改方法:計算機,屬性,高階系統設定,環境變數,新增WORKON_HOME,如圖(windows 10 環境變數設定截圖):

3.2 使用方法:

mkvirtualenv zqxt:建立執行環境zqxt

workon zqxt: 工作在 zqxt 環境 或 從其它環境切換到 zqxt 環境

deactivate: 退出終端環境

其它的:

rmvirtualenv ENV:刪除執行環境ENV

mkproject mic:建立mic專案和執行環境mic

mktmpenv:建立臨時執行環境

lsvirtualenv: 列出可用的執行環境

lssitepackages: 列出當前環境安裝了的包

建立的環境是獨立的,互不干擾,無需sudo許可權即可使用 pip 來進行包的管理。

 三、Django 基本命令

1. 新建一個 django project

django-admin startproject project-name

一個 project 為一個專案,project-name 專案名稱,改成你自己的,要符合Python 的變數命名規則(以下劃線或字母開頭)

2. 新建 app

python manage.py startapp app-name
或 django-admin.py startapp app-name

一般一個專案有多個app, 當然通用的app也可以在多個專案中使用。

3. 同步資料庫

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

這種方法可以建立表,當你在models.py中新增了類時,執行它就可以自動在資料庫中建立表了,不用手動建立。

備註:對已有的 models 進行修改,Django 1.7之前的版本的Django都是無法自動更改表結構的,不過有第三方工具 south,詳見 Django 資料庫遷移 一節。

4. 使用開發伺服器

開發伺服器,即開發時使用,一般修改程式碼後會自動重啟,方便除錯和開發,但是由於效能問題,建議只用來測試,不要用在生產環境。

複製程式碼
python manage.py runserver
 
# 當提示埠被佔用的時候,可以用其它埠:
python manage.py runserver 8001
python manage.py runserver 9999
(當然也可以kill掉佔用埠的程序)
 
# 監聽所有可用 ip (電腦可能有一個或多個內網ip,一個或多個外網ip,即有多個ip地址)
python manage.py runserver 0.0.0.0:8000
# 如果是外網或者區域網電腦上可以用其它電腦檢視開發伺服器
# 訪問對應的 ip加埠,比如 http://172.16.20.2:8000
複製程式碼

5. 清空資料庫

python manage.py flush

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

6. 建立超級管理員

python manage.py createsuperuser
 
# 按照提示輸入使用者名稱和對應的密碼就好了郵箱可以留空,使用者名稱和密碼必填
 
# 修改 使用者密碼可以用:
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

如果你安裝了 bpython 或 ipython 會自動用它們的介面,推薦安裝 bpython。

這個命令和 直接執行 python 或 bpython 進入 shell 的區別是:你可以在這個 shell 裡面呼叫當前專案的 models.py 中的 API,對於操作資料,還有一些小測試非常方便。

9. 資料庫命令列

python manage.py dbshell

Django 會自動進入在settings.py中設定的資料庫,如果是 MySQL 或 postgreSQL,會要求輸入資料庫使用者密碼。

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

10. 更多命令

終端上輸入 python manage.py 可以看到詳細的列表,在忘記子名稱的時候特別有用。

四、Django 檢視與網址

4.1 首先,新建一個專案(project), 名稱為 mysite

django-admin startproject mysite

備註:

1. 如果 django-admin 不行,請用 django-admin.py

2. 如果是在Linux是用原始碼安裝的,或者用 pip 安裝的,也是用  django-admin.py 命令

執行後,如果成功的話, 我們會看到如下的目錄樣式  

複製程式碼
1 mysite
2 ├── manage.py
3 └── mysite
4     ├── __init__.py
5     ├── settings.py
6     ├── urls.py
7     └── wsgi.py
複製程式碼

我們會發現執行命令後,新建了一個 mysite 目錄,其中還有一個 mysite 目錄,這個子目錄 mysite 中是一些專案的設定settings.py 檔案,總的urls配置檔案 urls.py 以及部署伺服器時用到的 wsgi.py 檔案, __init__.py 是python包的目錄結構必須的,與呼叫有關。

我們到外層那個 mysite 目錄下(不是mysite中的mysite目錄)

4.2新建一個應用(app), 名稱叫 learn

python manage.py startapp learn # learn 是一個app的名稱

我們可以看到mysite中多個一個 learn 資料夾,其中有以下檔案。

1 learn/
2 ├── __init__.py
3 ├── admin.py
4 ├── models.py
5 ├── tests.py
6 └── views.py

注:Django 1.8.x 以上的,還有一個 migrations 資料夾。Django 1.9.x 還會在 Django 1.8 的基礎上多出一個 apps.py 檔案。但是這些都與本文無關。

把我們新定義的app加到settings.py中的INSTALL_APPS

修改 mysite/mysite/settings.py

複製程式碼
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'learn',
)
複製程式碼

備註,這一步是幹什麼呢? 新建的 app 如果不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模板檔案(app-name/templates/下的檔案)和靜態檔案(app-name/static/中的檔案) , 後面你會學習到它們分別用來幹什麼.

定義檢視函式(訪問頁面時的內容)

我們在learn這個目錄中,把views.py開啟,修改其中的原始碼,改成下面的

#coding:utf-8
from django.http import HttpResponse
 
def index(request):
    return HttpResponse(u"Hello World!")

第一行是宣告編碼為utf-8, 因為我們在程式碼中用到了中文,如果不宣告就報錯.

第二行引入HttpResponse,它是用來向網頁返回內容的,就像Python中的 print 一樣,只不過 HttpResponse 是把內容顯示到網頁上。

我們定義了一個index()函式,第一個引數必須是 request,與網頁發來的請求有關,request 變數裡面包含getpost的內容,使用者瀏覽器,系統等資訊在裡面(後面會講,先了解一下就可以)。

函式返回了一個 HttpResponse 物件,可以經過一些處理,最終顯示幾個字到網頁上。

那問題來了,我們訪問什麼網址才能看到剛才寫的這個函式呢?怎麼讓網址和函式關聯起來呢?

定義檢視函式相關的URL(網址)  (即規定 訪問什麼網址對應什麼內容)

我們開啟 mysite/mysite/urls.py 這個檔案, 修改其中的程式碼:

注:由於 Django 版本對 urls.py 進行了一些更改

Django 1.7.x 及以下的同學可能看到的是這樣的:

複製程式碼
from django.conf.urls import patterns, include, url
 
from django.contrib import admin
admin.autodiscover()
 
urlpatterns = patterns('',
    url(r'^$', 'learn.views.index'),  # new
    # url(r'^blog/', include('blog.urls')),
 
    url(r'^admin/', include(admin.site.urls)),
)
複製程式碼

Django 1.8.x及以上,Django 官方鼓勵(或說要求)先引入,再使用:

複製程式碼
from django.conf.urls import url
from django.contrib import admin
from learn import views as learn_views  # new
 
urlpatterns = [
    url(r'^$', learn_views.index),  # new
    url(r'^admin/', admin.site.urls),
]
複製程式碼

以上都修改並儲存後,我們來看一下效果!

在終端上執行 python manage.py runserver 我們會看到類似下面的資訊:

複製程式碼
$ python manage.py runserver
 
Performing system checks...
 
System check identified no issues (0 silenced).
 
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
 
December 22, 2015 - 11:57:33
Django version 1.9, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
複製程式碼

不出意料的話會看到:

 

注意:如果是在另一臺電腦上訪問要用 python manage.py ip:port 的形式,比如監聽所有ip:

python manage.py runserver 0.0.0.0:8000
 
監聽機器上所有ip 8000埠,訪問時用電腦的ip代替 127.0.0.1

Django中的 urls.py 用的是正則進行匹配的,如果不熟悉,您可以學習正則表示式以及Python正則表示式

五、Django 檢視與網址進階

5.1在網頁上做加減法

5.1.1  採用 /add/?a=4&b=5 這樣GET方法進行

django-admin.py startproject zqxt_views
cd zqxt_views
python manage.py startapp calc

自動生成目錄大致如下(因不同的 Django 版本有一些差異,如果差異與這篇文章相關,我會主動提出來,沒有說的,暫時可以忽略他們之間的差異,後面的教程也是這樣做):

複製程式碼
zqxt_views/
├── calc
│   ├── __init__.py
│   ├── admin.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── zqxt_views
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
複製程式碼

我們修改一下 calc/views.py檔案

複製程式碼
from django.shortcuts import render
from django.http import HttpResponse
 
def add(request):
    a = request.GET['a']
    b = request.GET['b']
    c = int(a)+int(b)
    return HttpResponse(str(c))
複製程式碼

注:request.GET 類似於一個字典,更好的辦法是用 request.GET.get('a', 0) 當沒有傳遞 a 的時候預設 a 為 0

接著修改 zqxt_views/urls.py 檔案,新增一個網址來對應我們剛才新建的檢視函式。

Django 1.7.x 及以下的同學可能看到的是這樣的:

複製程式碼
from django.conf.urls import patterns, include, url
 
from django.contrib import admin
admin.autodiscover()
 
urlpatterns = patterns('',
    # Examples:
    url(r'^add/$', 'calc.views.add', name='add'), # 注意修改了這一行
    # url(r'^blog/', include('blog.urls')),
 
    url(r'^admin/', include(admin.site.urls)),
)
複製程式碼

Django 1.8.x及以上,Django 官方鼓勵(或說要求)先引入,再使用,低版本的 Django 也可以這樣用:

複製程式碼
from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views
 
 
urlpatterns = [
    url(r'^add/', calc_views.add, name='add'),  # 注意修改了這一行
    url(r'^admin/', admin.site.urls),
]
複製程式碼

我們開啟開發伺服器並訪問

python manage.py runserver
如果提示 Error: That port is already in use.在後面加上埠號8001,8888等
python manage.py runserver 8001

就可以看到網頁上顯示一個 9,試著改變一下a和b對應的值試試看?

5.1.2 採用 /add/3/4/ 這樣的網址的方式

前面介紹的時候就說過 Django 支援優雅的網址

我們接著修改 calc/views.py檔案,再新定義一個add2 函式,原有部分不再貼出

def add2(request, a, b):
    c = int(a) + int(b)
    return HttpResponse(str(c))

接著修改 zqxt_views/urls.py 檔案,再新增一個新的 url

Django 1.7.x 及以下:

url(r'^add/(\d+)/(\d+)/$', 'calc.views.add2', name='add2'),

Django 1.8.x 及以上:

 url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

我們可以看到網址中多了 (\d+), 正則表示式中 \d 代表一個數字,+ 代表一個或多個前面的字元,寫在一起 \d+ 就是一個或多個數字,用括號括起來的意思是儲存為一個子組(更多知識請參見 Python 正則表示式),每一個子組將作為一個引數,被 views.py 中的對應檢視函式接收

5.2 url 中的 name [技能提升]

我們還有剛才的程式碼,再來看一下 urls.py 中的程式碼(注意:第二條改成了 add2)

複製程式碼
from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views
 
 
urlpatterns = [
    url(r'^add/', calc_views.add, name='add'),
    url(r'^add2/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
    url(r'^admin/', admin.site.urls),
]
複製程式碼

url(r'^add/$', calc_views.add, name='add'), 這裡的 name='add' 是用來幹什麼的呢?

我們在開發的時候,剛開始想用的是 /add2/4/5/ ,後來需求發生變化,比如我們又想改成 /4_add_5/這樣的格式,但是我們在網頁中,程式碼中很多地方都寫死的是 

<a href="/add2/4/5/">計算 4+5</a>

那麼有沒有更優雅的方式來解決這個問題呢?當然答案是肯定的。

我們先說一下如何用 Python 程式碼獲取對應的網址:

我們在終端上輸入(推薦安裝 bpython, 這樣Django會用 bpython的 shell)

C:\Users\Administrator\Desktop\文件\day17\zqxt_views>python3.5 manage.py shell                                                                                                                                    
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.urlresolvers import reverse
>>> reverse('add2', args=(4,5))
'/add/4/5/'
>>> reverse('add2', args=(444,555))
'/add/444/555/'
>>>

reverse 接收 url 中的 name 作為第一個引數,我們在程式碼中就可以通過 reverse() 來獲取對應的網址(這個網址可以用來跳轉,也可以用來計算相關頁面的地址),只要對應的 url 的name不改,就不用改程式碼中的網址。

在網頁模板中也是一樣,可以很方便的使用。

複製程式碼
不帶引數的:
{% url 'name' %}
帶引數的:引數可以是變數名
{% url 'name' 引數 %}
 
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
複製程式碼

上面的程式碼渲染成最終的頁面是

<a href="/add2/4/5/">link</a>

這樣就可以通過 {% url 'add2' 4 5 %} 獲取到對應的網址 /add2/4/5/

當 urls.py 進行更改,前提是不改 name(這個引數設定好後不要輕易改),獲取的網址也會動態地跟著變,比如改成:

url(r'^new_add/(\d+)/(\d+)/$', 'calc.views.add2', name='add2'),

注意看重點 add2 變成了 new_add但是後面的 name='add2' 沒改,這時 {% url 'add2' 4 5 %} 就會渲染對應的網址成 /new_add/4/5/

reverse 函式也是一樣,獲取的時候會跟著變成新的網址,這樣,在想改網址時只需要改 urls.py 中的正則表示式(url 引數第一部分),其它地方都“自動”跟著變了,是不是這樣更好呢?

另外,如何讓以前的 /add2/3/4/自動跳轉到新的網址呢要知道Django不會幫你做這個,這個需要自己來寫一個跳轉方法

具體思路是,在 views.py 寫一個跳轉的函式:

複製程式碼
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
 
 
def old_add2_redirect(request, a, b):
    return HttpResponseRedirect(
        reverse('add2', args=(a, b))
    )
複製程式碼

urls.py中:

  url(r'^add2/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
  url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

這樣,假如使用者收藏夾中有 /add2/4/5/ ,訪問時就會自動跳轉到新的 /new_add/4/5/ 了

開始可能覺得直接寫網址簡單,但是用多了你一定會發現,用“死網址”的方法很糟糕