1. 程式人生 > >使用 Python 和 Django 搭建 Web 應用

使用 Python 和 Django 搭建 Web 應用

default 2.6 password 簡單的 object ets domain ans 版本

使用 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: [email protected]
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 查看。

  

使用 Python 和 Django 搭建 Web 應用