Perface
Django是一個開源的Web應用框架,由Python寫成,並於2005年7月在BSD許可證下發布。Django的主要目標是使得開發複雜的、數據庫驅動的網站變得簡單。Django採用MVC設計模式注重組件的重用性和“可插拔性”,敏捷開發和DRY法則(Don’t Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和數據模型。本文介紹Django在Linux+Mysql環境下安裝、配置的過程,包括安裝、運行、添加應用的所有流程,最終建立一個可以從Mysql讀取文章並顯示的Django應用。文章面向剛接觸Python/Django的初學者,所以安裝過程都以默認環境爲主,用pip可以大大簡化安裝過程。
Install
首先下載Django
得到Django-1.4.tar.gz,將其解壓後安裝
cd Django-1.4
sudo python setup.py install
如果提示缺少setuptools還要下載安裝setuptools(建議提前安上,因爲在安裝MySQL for Python的時候也會用到)。
完成安裝後,Django會拷貝一個django-admin.py到/usr/local/bin下,這個py文件引入了Django的管理模塊。
進階方式:virtualenv, pip
Setup
要創建一個Django項目非常簡單,使用startproject命令,輸入項目名稱:
Django會在當前目錄下自動生成一個名爲mysite的文件夾,裏面有以下文件:
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
以上是Django 1.4以後的目錄結構,如果是1.4之前的版本,manage.py和settings.py等文件是在同一層。manage.py只是用來執行命令,移動或是改名都沒有影響。實際的項目文件夾是和manage.py同一層的mysite文件夾,所以下文提到項目文件夾都指mysite/mysite。
- __init__.py:python特性,可以是空文件,只是表明這個文件夾是一個可以導入的包。
- settings.py:配置文件,主要是數據庫信息、加載模塊的信息。
- manage.py:命令行工具,實現與Django之間的交互。
- wsgi.py:開發都是用Django自帶的測試服務器,用wsgi啓動Django時才用得上。
創建項目後,進入項目文件夾,啓動Django自帶的web服務器:
Django會自動檢查配置文件中的錯誤,如果全部正常則順利啓動:
0 errors found
Django version 1.4.1, using settings ‘mysite.settings’
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
訪問http://127.0.0.1:8000,如果順利顯示,說明Django已經可以正常使用了。但現在只有本機可以訪問,要讓外網能夠訪問,或是要更換默認的8000端口,可以執行命令:
這樣就將端口修改爲8080,且外網也可以通過IP訪問本機上的Django。
現在要讓Django支持Mysql數據庫。編輯配置文件(settings.py)。在第12行找到
1 2 3 4 5 6 7 8 9 10 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #設置爲mysql數據庫 'NAME': 'dmyz', #mysql數據庫名 'USER': 'root', #mysql用戶名,留空則默認爲當前linux用戶名 'PASSWORD': '', #mysql密碼 'HOST': '', #留空默認爲localhost 'PORT': '', #留空默認爲3306端口 } } |
因爲Django要通過Python操作Mysql,所以要先安裝Mysql for Python。在Ubuntu下安裝還會提示EnvironmentError: mysql_config not found。因爲通過apt-get安裝的mysql沒有安裝開發工具包,所以找不到mysql_config文件,使用以下命令安裝:
sudo apt-get install libmysqld-dev
URL
URL配置文件很象一個目錄,Django會通過URL配置文件來查找相應的對象,URL地址的使用正則表達式設置。在mysite目錄下可以找到urls.py文件,它是URL配置的默認起點(也可以通過編輯settings.py中的 ROOT_URLCONF值來修改)。直接編輯urls.py
1 2 3 |
urlpatterns = patterns('', (r'^$', 'mysite.hello.index'), ) |
- r’^$’:正則,表示根目錄;
- mysite.hello.index:指向mysite這個項目下的hello模塊中的index函數。
剩下的就很簡單了,在mysite文件夾下建立一個hello.py文件,在其中寫入一個index函數:
1 2 3 4 |
#hello.py from django.http import HttpResponse def index(request): return HttpResponse('hello, world') |
刷新網站首頁,看到已經輸出了”hello, world”。
另一種方法: 設置一個hello模塊只是方便理解Django的結構,但如果一個首頁就要使用那麼多代碼,是很不pythonic的,所以在生產環境中我們的首頁通常會這麼來寫:
#url.py urlpatterns = patterns('', url(r'^$', 'django.views.generic.simple.direct_to_template', {'template':'index.html'}), )
Django會自動在模板目錄中找到並加載index.html,只需要修改url.py一個文件就搞定了。
Application
上一節”hello world”的例子只是說明了URL的用法,可以說完全沒有用到Django。Django作爲一個Web框架,目的是實現MVC的分離,它可以自行處理一些通用的操作,讓開發人員可以專注於核心應用的開發。所以,本文的最後一步將編寫一個名爲article的應用,從mysql數據庫裏讀取出文章作者、標題、內容。
首先建立應用,在項目文件夾中執行:
運行後在項目文件夾中會增加一個article文件夾,裏面有如下文件
views.py
__init__.py
- models.py:模型文件,用一個 Python 類來描述數據表,運用它可以通過簡單的 Python 的代碼來創建、檢索、更新、刪除數據庫中的記錄而無需寫一條又一條的SQL語句。
- views.py:視圖文件,用來聯繫模型與模版。
然後編寫模型文件(article/models.py),用來實現對數據庫的操作:
1 2 3 4 5 6 7 |
from django.db import models # Create your models here. class Article(models.Model): title = models.CharField(max_length=50) author = models.CharField(max_length=50) content = models.CharField(max_length=200) |
現在要修改配置文件(settings.py)文件,告訴Django這個應用是項目的一部分,打開配置文件,在尾部找到INSTALLED_APPS元組,將article添加進去:
1 2 3 4 5 6 7 8 9 10 11 |
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django_openid_auth', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', #…… 'article', #加入app ) |
可以現運行manage.py sql article命令進行測試,如果可以看到生成的sql語句,說明模型已經正常設置,可以初始化並安裝:
Django會自動創建名爲article_article的表。而且,因爲在INSTALLED_APPS中使用了django.contrib.auth,所以syncdb命令會要求提供一個管理員帳號和密碼,用來登錄Django的管理工具。
Would you like to create one now? (yes/no): yes
簡單的模型就設置完成了,現在來設置視圖,編輯視圖(article/views.py)文件:
1 2 3 4 5 6 7 |
# article/views.py from django.shortcuts import render_to_response from models import Article def latest_article(request): article_list = Article.objects.order_by('-id') return render_to_response('article/article.html',{'article_list':article_list}) |
- 2行:導入Django的render_to_response()函數,它用來調用模板、填充內容和返回包含內容的頁面。
- 3行:導入之前編寫模型文件中的Article類。
- 4~6行:定義一個latest_article函數,利用Article類從數據庫獲得數據,並按照id倒序輸出。然後調用模版文件,將變量傳遞過去。
在上面的代碼中使用的模版文件,它的地址是設置文件中的模版路徑+在views.py中定義的路徑,因此如果報錯TemplateDoesNotExist at 路徑的話,很可能就是忘了設置模板路徑。
編輯設置文件(settings.py),修改TEMPLATE_DIRS,設置一個模版路徑,這裏將模版目錄直接指定在項目文件夾(mysite)中:
TEMPLATE_DIRS = (
"/var/www/mysite"
)
這樣程序運行時,加載的靜態模版就是 /var/www/mysite/article/article.html了。如果使用過其它框架或者模板引擎,下面article.html的內容就很容易看懂了,Django在模版文件中利用相應的TAG控制傳遞過來的變量顯示的位置:
{% for article in article_list %} Author:{{ article.author }} Title:{{ article.title }} Content:{{ article.title }} {% endfor %}
最後,修改URL配置文件,讓article/指向視圖(views.py)中定義的latest_articl函數:
這樣所有的配置就完成了,當訪問 http://127.0.0.1:8000/article,Django就會自動讀取數據庫中的內容,並顯示在網頁上了。
Epilogue
本文的一些設置並不適用於實際生產環境,比如URL配置,爲了方便重用,通常都會使用include的方式,而在這裏則是直接指定。所以本文旨在介紹一些入門知識和快速配置的方法,如果希望更規範的學習Django,首推Django的官方文檔,其次是Djangobook,我更新這篇文章的時候Djangobook2.0中文版已經翻譯了大半了,也是學習Django很好的教材。