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