Django是一個非常強大的Python Web開發框架,它以"快速開發"和"乾淨、實用的設計"為設計宗旨。本文將從Django的基本概念開始,逐漸引導大家理解如何使用Django構建複雜的web應用程式。
首先,讓我們從Django的核心元件開始講解。Django遵循MVC模型-檢視-控制器設計模式,並在Python中有一個特殊的表現形式,稱為MTV模型-模板-檢視。這是因為Django的控制器部分由框架自身內部處理,而開發者主要與模型、模板和檢視互動。
# 範例程式碼:建立一個Django模型
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
def __str__(self):
return self.title
在上面的程式碼中,我們定義了一個簡單的部落格模型,包含標題和內容兩個欄位。其中,CharField
和TextField
都是Django提供的資料庫欄位型別。
在Django中,檢視是Python函數,用於接收Web請求並返回Web響應。每個檢視函數都將一個HttpRequest物件作為引數,並返回一個HttpResponse物件。檢視與Web應用程式的URLs關聯,這是通過URL設定完成的。
# 範例程式碼:建立一個檢視
from django.http import HttpResponse
from .models import Blog
def blog_index(request):
blogs = Blog.objects.all()
output = ', '.join([blog.title for blog in blogs])
return HttpResponse(output)
# 範例程式碼:URL設定
from django.urls import path
from . import views
urlpatterns = [
path('blogs/', views.blog_index, name='blog_index'),
]
上述程式碼中,我們首先定義了一個檢視blog_index
,該檢視從資料庫獲取所有的部落格條目並顯示其標題。然後我們在URL設定中建立了一個新的URL路徑'blogs/',將其關聯到blog_index
檢視。
Django的模板系統允許我們建立動態HTML頁面。Django模板使用自己的語言,是Python的一個小子集。
<!-- 範例程式碼:建立一個模板 -->
{% for blog in blogs %}
<h2>{{ blog.title }}</h2>
<p>{{ blog.content }}</p>
{% endfor %}
在上述程式碼中,我們建立了一個模板,該模板接收一個部落格物件列表,併為每個物件生成一個HTML段落。
Django還有一個非常強大的功能,即中介軟體。Django的中介軟體是一種輕量級的、底層的「外掛」系統,用於全域性改變Django的輸入或輸出。
下面是一個例子,展示瞭如何建立一個簡單的中介軟體來記錄每個請求的處理時間。
# 範例程式碼:建立一箇中介軟體
import time
from django.http import HttpResponse
class TimingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start_time = time.time()
response = self.get_response(request)
end_time = time.time()
response['X-Elapsed-Time'] = str(end_time - start_time)
return response
在上面的程式碼中,我們建立了一個TimingMiddleware
中介軟體,該中介軟體在每次請求時計算請求的處理時間,並在HTTP響應頭中新增一個X-Elapsed-Time
欄位來顯示這個時間。
在Django中,資料庫遷移是一種非常強大的功能,它可以讓我們在不丟失資料的情況下更改資料庫的結構。讓我們來看一個例子。
# 在models.py中,我們將Blog模型修改如下:
class Blog(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.CharField(max_length=100) #新增的欄位
def __str__(self):
return self.title
在上面的程式碼中,我們為Blog模型新增了一個author
欄位。為了將這個改動應用到資料庫中,我們需要進行資料庫遷移。
# 執行以下命令生成遷移檔案
python manage.py makemigrations
# 執行以下命令應用遷移
python manage.py migrate
通過上述命令,Django會自動在資料庫中為Blog模型新增一個新的欄位,而不需要我們手動修改資料庫。
Django的表單功能可以讓我們更容易地接收和處理使用者資料。同時,Django還提供了多種驗證功能,可以幫助我們驗證使用者資料的有效性。
# 範例程式碼:建立一個表單
from django import forms
from .models import Blog
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['title', 'content', 'author']
# 在檢視中使用表單
def new_blog(request):
if request.method == 'POST':
form = BlogForm(request.POST)
if form.is_valid():
form.save()
return HttpResponse('Blog saved.')
else:
form = BlogForm()
return render(request, 'new_blog.html', {'form': form})
在上述程式碼中,我們建立了一個基於Blog模型的表單,然後在new_blog
檢視中使用這個表單。當檢視收到POST請求時,它會驗證表單資料,如果資料有效,則儲存新的部落格並返回一個響應。
Django Rest Framework是一個強大的工具,用於構建Web API。使用DRF,我們可以快速地建立RESTful API。
# 範例程式碼:建立一個API檢視
from rest_framework import generics
from .models import Blog
from .serializers import BlogSerializer
class BlogListCreate(generic.ListCreateAPIView):
queryset = Blog.objects.all()
serializer_class = BlogSerializer
在上面的程式碼中,我們使用DRF的ListCreateAPIView
檢視,這個檢視可以處理GET和POST請求。我們需要提供一個queryset
和一個serializer_class
,DRF會自動處理請求和響應。
最後,我們要介紹的是Django的訊號(Signals)。訊號是Django的一種事件驅動機制,當某件事情發生時,會傳送一個訊號,我們可以編寫接收器(receivers)來監聽這些訊號。
# 範例程式碼:建立一個訊號接收器
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Blog
@receiver(post_save, sender=Blog)
def notify_admin(sender, instance, created, **kwargs):
if created:
print(f'New blog created: {instance.title}')
在上面的程式碼中,我們建立了一個接收器notify_admin
,它會在每次建立新的Blog物件後被呼叫。訊號讓我們可以編寫解耦的程式碼,使我們的應用更易於維護和擴充套件。
希望這篇文章能幫助你深入理解和掌握Django。如果你有任何問題或者想要探討更深入的話題,歡迎留言。
如有幫助,請多關注
個人微信公眾號:【Python全視角】
TeahLead_KrisChang,10+年的網際網路和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿里雲認證雲服務資深架構師,上億營收AI產品業務負責人。