使用 Python 和 Django 搭建 Web 應用 簡介 Django 是 Python 開發的 Web 框架。使用 Django 搭建 Web 應用很方便。 寫本文時 django 的最新版本爲 1.4,但本文不關注新版本的特性,只搭建一個簡單的應用。 安裝 Django 本文以 CentOS 6.2 爲例進行安裝: 安裝 python # yum install python 本文使用的是 CentOS 6.2 Desktop,默認安裝了 python. 查看一下 python 的版本 # python --version Python 2.6.6 Django-1.4 支持 python 2.5 以上( python3 暫不支持)。具體請看 Django的官方博客。 根據 python 的版本安裝 setuptools,pip(使用pip安裝軟件很方便,pip 依賴 setuptools),安裝 setuptools 很簡單,到其 pipy 下載並安裝(注意跟 python 的版本對應)。 # curl -O http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg # sh setuptools-0.6c11-py2.6.egg # curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py # python get-pip.py 本文關注 django ,暫不考慮 virtualenv,buildout 等虛擬環境的安裝。 安裝 django # pip install django 查看 django 的版本 $ django-admin.py --version 1.4 建立Django項目及Web應用 使用 django 搭建 Web 應用很快。 $ mkdir ~/dev $ cd ~/dev 建立項目,使用 django-admin.py 的 startproject 命令。 ~/dev$ django-admin.py startproject djdemo django-1.4 建立的目錄結構較之前的版本有了些調整,本文例子以下: . `--djdemo |--djdemo | |--__init__.py | |--settings.py | |--urls.py | `--wsgi.py `--manage.py 建立應用,使用 manage.py 的 startapp 命令,本文建立一個訂單(Order)的例子。 $ cd djdemo ~/dev/djdemo$ python manage.py startapp orders django 會自動建立此應用的基本文件,目錄以下: . `--djdemo |--djdemo | |--__init__.py | |--settings.py | |--urls.py | `--wsgi.py + |--orders + | |--__init__.py + | |--models.py + | |--tests.py + | `--views.py `--manage.py 在 orders 文件夾中新建 admin.py ,用於 django 管理工具使用。最終目錄以下: . `--djdemo |--djdemo | |--__init__.py | |--settings.py | |--urls.py | `--wsgi.py |--orders | |--__init__.py + | |--admin.py | |--models.py | |--tests.py | `--views.py `--manage.py 建立一個 Django 的模型 接下來修改 models.py,管理此應有的模型。 注意:若是使用非 ASCII 碼,須要在文件頭部添加 # -*- coding: utf-8 -*- 添加 Order 模型: # -*- coding: utf-8 -*- from django.db import models # Create your models here. from django.utils.translation import ugettext_lazy as _ class Order(models.Model): order_no = models.CharField(max_length=255) description = models.CharField(max_length=255) created_on = models.DateTimeField(help_text=_('creation date'), auto_now_add = True) updated_on = models.DateTimeField(help_text=_('last update date'), auto_now = True) def __unicode__(self): return self.order_no 這是一個 models 的例子,設計到了屬性,國際化,自動填充時間等內容,關於 models,更多請參考 django 網站的 models相關文檔。 如下是 admin.py 的內容,使 django 能夠管理這個模型。 一般只須要添加就能夠了以下例子: # -*- coding: utf-8 -*- from django.contrib import admin from .models import Order admin.site.register(Order) 可是django能夠定製管理界面。以下更改: # -*- coding: utf-8 -*- from django.contrib import admin from django.utils.translation import ugettext_lazy as _ from .models import Order class OrderAdmin(admin.ModelAdmin): """Admin form Order model""" list_display = ('order_no', 'description', 'created_on') search_fields = ('order_no', 'description') fieldsets = ( (_('Content'), { 'fields': ('order_no', 'description') }), (_('Advanced options'), { 'classes': ('collapse',), 'fields': ('created_on', 'updated_on') }), ) actions_on_top = True actions_on_bottom = True readonly_fields = ("created_on", "updated_on") admin.site.register(Order, OrderAdmin) 這是一個 admin 的例子,涉及到了列表顯示,搜索,配置界面等,關於 admin,更多請參考 django 網站的文檔 admin 相關文檔。 配置 主要配置 settings.py 和 urls.py。 在 settings.py 開始添加以下,主要設置路徑: # -*- coding: utf-8 -*- # Django settings for djdemo project. import os import sys ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) if ROOT_PATH not in sys.path: sys.path.append(ROOT_PATH) 修改數據庫配置,本文使用 sqlite3,這是 django 自帶驅動的,其餘的請參考 django 網站的 database 相關文檔 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': os.path.abspath(os.path.join(ROOT_PATH, '..', 'sqlite.db')), # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } } 接下來修改 INSTALLED_APPS 部分: 將 orders 應用添加到 INSTALLED_APPS 設置中,並去掉 admin 模塊的#註釋。 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', ) INSTALLED_APPS += ( 'orders', ) 配置 urls.py。 要讓該管理工具能夠經過 /admin URL 使用,只須要簡單地取消項目的 urls.py 文件中提供的對應行的內容便可。 # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'djdemo.views.home', name='home'), # url(r'^djdemo/', include('djdemo.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), ) 此時,程序基本配置完畢,下面開始數據庫的初始化和 django 管理界面的使用。 先進行 sql 語句的顯示,能夠查看錶結構是否正確(必須指明應用名稱,本文爲orders)。使用 manage.py 的 sqlall 命令。 ~/dev/djdemo$ python manage.py sqlall orders 獲得以下結果 BEGIN; CREATE TABLE "orders_order" ( "id" integer NOT NULL PRIMARY KEY, "order_no" varchar(255) NOT NULL, "description" varchar(255) NOT NULL, "created_on" datetime NOT NULL, "updated_on" datetime NOT NULL ) ; COMMIT; 接下來開始數據庫初始化,使用 manage.py 的 syncdb 命令, 期間會詢問是否添加 superusers,過程以下: ~/dev/djdemo$ python manage.py syncdb Creating tables ... Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_user_permissions Creating table auth_user_groups Creating table auth_user Creating table django_content_type Creating table django_session Creating table django_site Creating table django_admin_log Creating table orders_order You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use '****'): admin E-mail address: username@domain.com Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s) 此時數據庫初始化完畢。 測試 啓動 django,進行應用的測試,使用 manage.py 的 runserver 命令,開啓服務。 ~/dev/djdemo$ python manage.py runserver 如今能夠訪問 http://localhost:8000/admin 查看。