Python Django Web開發實戰

2023-06-30 18:01:21

Python Django全面介紹

Django是一個非常強大的Python Web開發框架,它以"快速開發"和"乾淨、實用的設計"為設計宗旨。本文將從Django的基本概念開始,逐漸引導大家理解如何使用Django構建複雜的web應用程式。

Django基本概念與原理

首先,讓我們從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

在上面的程式碼中,我們定義了一個簡單的部落格模型,包含標題和內容兩個欄位。其中,CharFieldTextField都是Django提供的資料庫欄位型別。

Django的檢視與URL設定

在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模板

Django的模板系統允許我們建立動態HTML頁面。Django模板使用自己的語言,是Python的一個小子集。

<!-- 範例程式碼:建立一個模板 -->
{% for blog in blogs %}
    <h2>{{ blog.title }}</h2>
    <p>{{ blog.content }}</p>
{% endfor %}

在上述程式碼中,我們建立了一個模板,該模板接收一個部落格物件列表,併為每個物件生成一個HTML段落。

Django中介軟體

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的資料庫遷移

在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的表單功能可以讓我們更容易地接收和處理使用者資料。同時,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 (DRF)

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會自動處理請求和響應。

One More Thing

最後,我們要介紹的是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產品業務負責人。