django簡談---從一個完整的django項目開啓學習之旅

    筆者組內之前有一個“XXX管理系統”是用django開發的。該項目包含web代碼及相關的腳本。因爲之前開發的同事早已離職,且組內只有筆者之前接觸過python,故,自然而然的,筆者接手了該項目。

    之前從沒接觸過django,只是寫過一些python腳本,對腳本的web框架,之前瞭解過ruby的ruby on rails。沒了完成該任務,只能自學django啦!

    現以本文記錄下此段時間的學習成果!   

    本文介紹了django的基本框架和開發流程,並不包含安裝、配置。網上有很多安裝和配置的文章,這裏就不再多做描述。

一、概念:

    百度一搜就有了:

    Django是一個開放源代碼的Web應用框架,由Python寫成。採用了MVC的軟件設計模式,即模型M,視圖V和控制器C。它最初是被開發來用於管 理勞倫斯出版集團旗下的一些以新聞內容爲主的網站的,即是CMS(內容管理系統)軟件。並於2005年7月在BSD許可證下發布。這套框架是以比利時的吉 普賽爵士吉他手Django Reinhardt來命名的。

    簡單來說就是一個python語言的web開發框架。用python這門腳本語言來開發web工程!

    Django是一個基於MVC構造的框架。學過javaEE的,應該都知道!但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),稱爲 MTV模式。

    至於MVC控制器部分,由Django框架的URLconf來實現。URLconf機制是使用正則表達式匹配URL,然後調用合適的Python函數。


二、工作機制:

  1. 用manage.py runserver 啓動Django服務器時就載入了在同一目錄下的settings.py。該文件包含了項目中的配置信息,如前面講的URLConf等,其中最重要的配置就是ROOT_URLCONF,它告訴Django哪個 Python模塊應該用作本站的URLConf,默認的是urls.py

  2. 當訪問url的時候,Django會根據ROOT_URLCONF的設置來裝載URLConf。

  3. 然後按順序逐個匹配URLConf裏的URLpatterns。如果找到則會調用相關聯的視圖函數,並把HttpRequest對象作爲第一個參數(通常是request)

  4. 最後該view函數負責返回一個HttpResponse對象。


三、詳細介紹:

    以下是一個完整的django項目的目錄信息:

wKiom1QidL3RofHLAAIhaZa48DQ249.jpg

    根目錄下的“manage.py”、“setting.py”和“urls.py”是一個django項目最基本的管理、配置和映射文件,下面會進行詳細介紹。

    “base_dict”、“geo_topology”、“net_bw”是本項目的三個模塊,根據需求不同可以自由添加模塊。每個模塊都包含兩個重要的文件“models.py”和“admin.py”:“models.py”文件配置了MTV模式的模型(Model)信息;“admin.py”文件配置了django自帶的管理(admin)模塊的模型(Model)信息。

    “common”模塊包含了一些公共的配置,如:登陸方式。

    “locale”模塊包含了國際化的相關文件。

    “media”包含了該項目的靜態文件,如:js、css、jpg等文件。

    “templetes”模塊包含了該項目的所有頁面文件,如:index.html。

    “timer_task”包含了該項目相關的腳本文件。


以下是相關模塊或文件的詳細介紹:

1、manage.py

    以下是一個通用的manage.py文件:

from django.core.management import execute_manager
import imp
try:
    imp.find_module('settings') # Assumed to be in the same directory.
except ImportError:
    import sys
    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
    sys.exit(1)
import settings
if __name__ == "__main__":
    execute_manager(settings)

    通過execute_manager(settings)語句指定了同目錄下的setting.py作爲該項目的配置文件。

2、setting.py

    如果不需要, Django settings 文件可以不必定義任何 settings. 因爲每個設置都有默認值. 這些默認值定義在django/conf/global_settings.py.

    setting.py可以包含你自己設置的變量,而在代碼中訪問它們。

通過從模塊 django.conf.settings 導入你需要的變量, 你的代碼可以訪問這個變量. 例子:

from django.conf.settings import 
DEBUG
if DEBUG:                 
    # Do something

注意一定不要從 global_settings 或你自己的 settings 模塊導入設置變量到你的代碼.             django.conf.settings 概括了默認設置和站點自定義設置的概念,它提供了一個統一的接口用於用戶代碼訪問, 也降低了用戶代碼與用戶設置的耦合程度.

    基本的配置項有:

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
#    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/'),
)
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:
    'app_name_translation_in_admin',
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
#    'django.contrib.admindocs',
    'eagle_eye.geo_topology',
    'eagle_eye.base_dict',
    'eagle_eye.net_bw',
)

    如果需要一個獨立的附加配置信息文件,用於覆蓋setting.py上的配置信息,可以通過:

# load product settings if exist
try:
    from settings_product import *
except ImportError: pass

    這樣的話,將會加載同路徑下settings_product.py配置文件,如果有同樣的配置項和setting.py衝突,則採用settings_product.py的配置信息。

    相關的setting的配置項網上有很多詳細介紹的文章,這裏不贅述了!

3、urls.py

    該文件時整個項目最基本的映射文件,下面是本項目的部分內容:

from django.conf.urls.defaults import patterns, include, url
import settings
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    url(r'^net_bw/', include('net_bw.urls')),
    (r'^accounts/login/$', 'django.contrib.auth.views.login'),
    (r'^accounts/logout/$', 'django.contrib.auth.views.logout_then_login'),
    (r'^main$','index.main'),
    (r'^top$','index.top'),
    (r'^left$','index.left'),
    (r'^$','index.index'),
)
  • 本工程的登陸及權限驗證模塊是用的django自帶的登陸驗證模塊。該自帶模塊可方便的實現登陸功能。相關的配置內容爲:

    a)、setting.py文件中要配置數據庫和相關中間件、app:

DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 
        'NAME': 'D:/django/loginsesion/db/db.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. 
    } 
} 
MIDDLEWARE_CLASSES = ( 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',                                        'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 
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', 
)

    b)、urls.py文件中要加上相應的映射配置:

    (r'^accounts/login/$', 'django.contrib.auth.views.login'),
    (r'^accounts/logout/$', 'django.contrib.auth.views.logout_then_login'),
  • 本工程的模塊管理也是用的django自帶的功能實現,即admin管理模塊。它可以非常簡單的實現模塊的管理功能:

    a)、在setting.py的“INSTALLED_APPS”配置項中添加如下內容:

    # Uncomment the next line to enable the admin:
    'app_name_translation_in_admin',

    b)、在urls.py文件中加上相應的映射配置:

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),

4、登陸、權限驗證模塊:

    相關配置在第3項中已描述,通過django自帶的該功能,就可輕鬆的實現登陸功能。在配置項上面提到的配置項後,運行“python manage.py syncdb”命令,即會在配置的數據庫中生成相應的用戶名、權限、角色等數據表,默認以“auth_”開頭命名。

    默認的登陸頁面爲“templates/registration/login.html”。

5、models.py

    該文件是django的ORM定義文件。文件的內容是各模塊對應的數據庫表定義,一個基本的文件結構如下:

from django.db import models
class BusinessType(models.Model):
    biz_code=models.CharField('業務類型編碼',max_length=30,unique=True)
    biz_cn_name=models.CharField('中文名稱',max_length=50)
    biz_en_name=models.CharField('英文名稱',max_length=50)
    class Meta:
        verbose_name='業務類型'
        verbose_name_plural='業務類型'
    def __unicode__(self):
        return self.biz_cn_name

    它其實就是po文件,用過hibernate等ORM框架的應該都知道。對應於數據庫中的表,屬性就是表的字段信息。相應的描述及配置,網上有很多文章介紹的很詳細,這裏就不贅述了。

6、admin.py

    該文件時admin管理模塊的ORM文件。定義了需要管理的數據對象信息。一個基本的文件結構如下:

from django.contrib import admin
from base_dict.models import BusinessType
class BizAdmin(admin.ModelAdmin):
    list_display = ('biz_code','biz_cn_name','biz_en_name')
    list_display_links=('biz_cn_name',)
    search_fields = ('biz_cn_name','biz_en_name')
admin.site.register(BusinessType,BizAdmin)

    該對象與models當中定義的對象對應,表示可對這些對象進行管理。django有自帶的管理頁面對其進行相應的管理。如“BizAdmin”定義爲對“BusinessType”的管理對象,在“BizAdmin”的定義中,配置了哪些屬性將在管理頁面的列表中進行展示,哪些屬性可對其搜索。。。。

    admin管理模塊會應用django自帶lib中的頁面文件進行頁面展示。相關的操作代碼也在lib中寫好了,一般不需要手動修改。只需要通過定義XXXAdmin對象就行了。   

    配置了admin管理模塊後,如果想對其進行自定義的操作,可以去lib中把相關文件拷貝到template/admin/目錄下進行二次開發。

wKioL1QigfCxGH9FAAHPAsVu2Xs604.jpg

    每一種admin的視圖,包括修改列表、編輯表單、刪除確認頁以及歷史視圖,都有一個與之相關聯的模板可以以多種方式來進行覆蓋。

    首先,你可以在全局上覆蓋模板。admin視圖使用標準的模板載入機制來查找模板。所以如果你在模板目錄中創建了一個新的模板,Django會自動地加載它。全局的模板在表17-1中列出。

    大多數時候,你可能只是想修改一個單獨的對象或應用程序,而不是修改全局性的設定。因此,每個admin視圖總是先去查找與模型或應用相關的模板。這些視圖尋找模板的順序如下:

  • admin/<app_label>/<object_name>/<template>.html

  • admin/<template>.html

    例如,在 books 這個應用程序中, Book 模塊的添加/編輯表單的視圖會按如下順序查找模板:

  • admin/books/book/change_form.html

  • admin/books/change_form.html

  • admin/change_form.html


四、自定義模塊開發流程

    1、在全局的urls.py中設置自定義模塊的urls文件位置:

        url(r'^net_bw/', include('net_bw.urls')),

    這樣,用戶請求的url中,以net_bw開頭的請求則會轉到net_bw\urls.py文件進行映射處理了。

    2、配置自定義模塊的urls.py文件:

from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('net_bw.bwreport',
    (r'^bwreport/(\d{1,2})/$', 'bw_report'),
)

    這樣的話,對於接收到用戶請求以bwreport開頭符合“^bwreport/(\d{1,2})/$”正則表達式的請求則會轉發到net模塊下的bwreport.py文件的bw_report方法進行處理。

    3、處理方法需要配置接收處理結果的展示頁面:

def bw_report(request, id, query_type, room_type):
......    
    return render_to_response('net_bw/bwreport.html',            
        return_value, context_instance=RequestContext(request))

    在方法的最後配置“render_to_response”,指定由net_bw/bwreport.html接收返回結果,並展示。

    這樣就完成了一個請求的基本處理流程。

    django的頁面展示也是基於模板的,類似於velocity和freemaker這些模板引擎。詳細的信息就不在這裏介紹了,網上有很多相關資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章