筆者組內之前有一個“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函數。
二、工作機制:
用manage.py runserver 啓動Django服務器時就載入了在同一目錄下的settings.py。該文件包含了項目中的配置信息,如前面講的URLConf等,其中最重要的配置就是ROOT_URLCONF,它告訴Django哪個 Python模塊應該用作本站的URLConf,默認的是urls.py
當訪問url的時候,Django會根據ROOT_URLCONF的設置來裝載URLConf。
然後按順序逐個匹配URLConf裏的URLpatterns。如果找到則會調用相關聯的視圖函數,並把HttpRequest對象作爲第一個參數(通常是request)
最後該view函數負責返回一個HttpResponse對象。
三、詳細介紹:
以下是一個完整的django項目的目錄信息:
根目錄下的“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/目錄下進行二次開發。
每一種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這些模板引擎。詳細的信息就不在這裏介紹了,網上有很多相關資料。