笔者组内之前有一个“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文件:
1
2
3
4
5
6
7
8
9
10
11
| 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 导入你需要的变量, 你的代码可以访问这个变量. 例子: 1
2
3
4
| from django.conf.settings import
DEBUG
if DEBUG:
# Do something
|
注意一定不要从 global_settings 或你自己的 settings 模块导入设置变量到你的代码. django.conf.settings 概括了默认设置和站点自定义设置的概念,它提供了一个统一的接口用于用户代码访问, 也降低了用户代码与用户设置的耦合程度.
基本的配置项有:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # 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上的配置信息,可以通过:
1
2
3
4
| # 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
该文件时整个项目最基本的映射文件,下面是本项目的部分内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| 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文件中要加上相应的映射配置:
1
2
| (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”配置项中添加如下内容:
1
2
| # Uncomment the next line to enable the admin:
'app_name_translation_in_admin',
|
b)、在urls.py文件中加上相应的映射配置:
1
2
| # 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定义文件。文件的内容是各模块对应的数据库表定义,一个基本的文件结构如下:
1
2
3
4
5
6
7
8
9
10
| 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文件。定义了需要管理的数据对象信息。一个基本的文件结构如下:
1
2
3
4
5
6
7
| 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视图总是先去查找与模型或应用相关的模板。这些视图寻找模板的顺序如下: 例如,在 books 这个应用程序中, Book 模块的添加/编辑表单的视图会按如下顺序查找模板:
四、自定义模块开发流程
1、在全局的urls.py中设置自定义模块的urls文件位置:
1
| url(r'^net_bw/', include('net_bw.urls')),
|
这样,用户请求的url中,以net_bw开头的请求则会转到net_bw\urls.py文件进行映射处理了。
2、配置自定义模块的urls.py文件:
1
2
3
4
| 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、处理方法需要配置接收处理结果的展示页面:
1
2
3
4
| 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这些模板引擎。详细的信息就不在这里介绍了,网上有很多相关资料。
|