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这些模板引擎。详细的信息就不在这里介绍了,网上有很多相关资料。

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