看了一段时间django官方文档,先把自己理解的django目录结构记录一下

目录结构

一个成熟的django项目的结构大致如下:

/project/
|-- project/
|-- settings.py # 项目配置
|-- urls.py # 项目路由定义
|-- wsgi.py # nginx/apache |-- app/
|-- templates/
|-- app/
|-- base.html # 模板
...
|-- admin.py # 配置模型models在django原生后台的管理
|-- apps.py # 应用级别的配置
|-- forms.py # 表单处理逻辑
|-- managers.py # 模型处理逻辑
|-- models.py # 模型定义
|-- urls.py # 路由设置
|-- views.py # 控制层
|-- tests.py
...
|-- other-app/
... # 另一个应用
|-- static/
|-- app/
|-- other-app/
|-- admin/

django 以多个应用(app)耦合的形式来组合成一个大的web项目(project),多个app之间可以相互调用,如:

from app1.models import SomeModel

所有应用需要在 settings.INSTALLED_APPS 中注册。除此之外,可在 settings.py 中配置一些公共参数,例如数据库,时区,邮箱,静态文件目录等

静态文件处理 static

好像django的静态文件位置没有限制,为了方便管理统一在根目录下面,按应用名建立目录。这样在web服务器 apahce/nginx 可以方便配置路径别名(Alias)转交web服务器直接进行处理。

同时在 settings.py 中设置 STATIC_URL = '/project/static/' 以在模板文件中通过{% static 'app/xxx.css' %}调用

django 原生后台管理 admin.py

django 自带admin 后台,通过 admin.py 很容易对简单的模型进行增删改查管理操作。

在业务逻辑不是很复杂的情况下,简单配置一下就可以实现对数据的管理。

django 路由控制 urls.py

urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='home'),
url(r'^more/$', views.delete, name='more'),
]

代码示例中有view函数和View类的两种不同定义方式

name参数定义在模板中解析的url变量名:{% url 'app:home' %}

django 模型定义 models.py & managers.py

个人认为学习理解 models 是掌握 django 的关键。跟以往php项目经验单独建立数据库不同,django 把数据库结构也包含到项目中。

models的定义主要包括数据表结构的各个字段(Field),表与表之间的关系(ForeignKey),对表的查询操作(Manager)

Field 和 Manger 都支持自定义

django 会根据models中的定义自动建立数据表:

# 定义模型
vim models.py
# 生成变更
python manage.py makemigrations
# 执行变更
python manage.py migrate

managers.py 属于 models 的一部分,我觉得这一块可以从models中拿出来单独定义。

它主要提供2个功能:

  • 修改默认的数据集 objects

    继承models.Manager 重写 get_queryset 方法,对默认的 queryset 进行预处理
    class DahlBookManager(models.Manager):
    def get_queryset(self):
    return super().get_queryset().filter(author='Roald Dahl')
  • 扩展默认的查询方法

    个人理解这里定义自己想要的各种复杂查询
class PollManager(models.Manager):
def with_counts(self):
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("""
SELECT p.id, p.question, p.poll_date, COUNT(*)
FROM polls_opinionpoll p, polls_response r
WHERE p.id = r.poll_id
GROUP BY p.id, p.question, p.poll_date
ORDER BY p.poll_date DESC""")
result_list = []
for row in cursor.fetchall():
p = self.model(id=row[0], question=row[1], poll_date=row[2])
p.num_responses = row[3]
result_list.append(p)
return result_list

django 逻辑控制 views.py & froms.py

相当于MVC中的 Controller 控制层。定义为各种函数,从传入的 request 中获取请求参数,生成 response

django 提供了很多封装函数如 render,get_object_or_404来方便处理。

此外,还可以使用基本视图类处理请求,View,TemplateView,RedirectView

forms 属于 views 的一部分,同样我觉得可以单独拿出来处理

它主要负责 views 从 request 中获取参数并预处理这部分逻辑

django 视图模板 templates

模板选择在 views 中通过render制定, 或 继承的 TemplateView 中定义template_name

template 文件支持继承,子模板通过重写 <% block %> 块来渲染不同页面:

# base.html
<div>Public block</div>
{% block private %}{% endblock private %}
# child.html
{% extends 'base.html' %}
{% block private %}
<div >private block</div>
{% endblock private %}

[Django笔记] django结构分析的更多相关文章

  1. Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)

    Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...

  2. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  3. Web框架——Django笔记

    Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序   ...

  4. 《玩转Django2.0》读书笔记-Django配置信息

    <玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...

  5. 《玩转Django2.0》读书笔记-Django建站基础

    <玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...

  6. 笔记-django第一个项目

    笔记-django第一个项目 1.      创建项目 安装 Django 之后,现在有了可用的管理工具 django-admin.可以使用 django-admin 来创建一个项目: 看下djang ...

  7. Django笔记 —— 基础部分总结

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  8. Django笔记 —— Admin(Django站点管理界面)

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  9. Django笔记 —— 模型

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

随机推荐

  1. PL/SQL Developer 的 SQL 编辑窗口显示行号

    版权声明:本文为博主原创文章,未经博主允许不得转载. 一直奇怪为什么 PL/SQL 6 系列的版本可以显示行号,为什么到了 7 .8 版本之后反而还不行了?而且我都已经设置了“显示行号”的呀. 如图: ...

  2. HTTP-接触

    [HTTP]http是基于TCP/IP协议的应用层协议,他不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认端口是80端口. 不同版本http协议里的相关概念[Conten ...

  3. 在Windows下编译WebRTC

    前言 这篇文章的目的在于为你节省生命中宝贵的10小时(甚至更多),或者浪费你10分钟.作为Google更新频繁的大型跨平台基础库,WebRTC的编译一直被人称为噩梦.如果恰巧你偏要在Windows下编 ...

  4. 树套树Day1线段树套平衡树bzoj3196

    您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...

  5. ES+open-falcon之报警自动发送请求信息

    当我们监控nginx的状态码出现错误状态码的时候, 一般的处理方法是通过kibana查询是哪个接口导致从而确定是哪个服务,再进一步登录业务机器查询业务日志确定原因. 我们现在要做的事情就是将 人为的通 ...

  6. vue-router路由嵌套的使用

    vue-router路由嵌套的使用,以及子路由中设置默认路由: 项目结构: 在/src/App.vue文件中: <template> <div id="app"& ...

  7. MVC系统过滤器(局部缓存,局部动态)

    1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为单位,理论上缓存时间可以 ...

  8. XML的二十个热点问题

    这些日子,几乎每个人都在谈论XML (Extensible Markup Language),但是很少有人真正理解其含义.XML的推崇者认为它能够解决所有HTML不能解决的问题,让数据在不同的操作系统 ...

  9. 【转】Pro Android学习笔记(十五):用户界面和控制(3):Button控件

    目录(?)[-] 基础Button ImageButton ToggleButton CheckBox RadioButton 基础Button Button是最常用的基础控件之一,在Android中 ...

  10. 杂项-权限管理:RBAC

    ylbtech-杂项-权限管理:RBAC 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中, ...