[Django筆記] django結構分析


看了一段時間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 %}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM