# Python Django全面介紹 Django是一個非常強大的Python Web開發框架,它以"快速開發"和"乾凈、實用的設計"為設計宗旨。本文將從Django的基本概念開始,逐漸引導大家理解如何使用Django構建複雜的web應用程式。 ## Django基本概念與原理 首先,讓我們從Dj ...
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
在上面的代碼中,我們定義了一個簡單的博客模型,包含標題和內容兩個欄位。其中,CharField
和TextField
都是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產品業務負責人。