Python開發(fā)從入門到精通:Web框架Django高級(jí)應(yīng)用實(shí)戰(zhàn)
一、學(xué)習(xí)目標(biāo)與重點(diǎn)
?? 學(xué)習(xí)目標(biāo):掌握Python Web框架Django的高級(jí)技巧,包括中間件、信號(hào)、緩存、表單驗(yàn)證、權(quán)限管理等;學(xué)習(xí)Django的高級(jí)功能;通過(guò)實(shí)戰(zhàn)案例實(shí)現(xiàn)高級(jí)Web應(yīng)用。
?? 學(xué)習(xí)重點(diǎn):中間件、信號(hào)、緩存、表單驗(yàn)證、權(quán)限管理、Django高級(jí)功能、Web應(yīng)用實(shí)戰(zhàn)。
33.1 Django高級(jí)功能概述
33.1.1 什么是Django高級(jí)功能
Django高級(jí)功能是指在Django框架基礎(chǔ)上提供的高級(jí)特性,包括中間件、信號(hào)、緩存、表單驗(yàn)證、權(quán)限管理等。這些功能可以幫助開發(fā)者更高效地開發(fā)復(fù)雜的Web應(yīng)用程序。
33.1.2 高級(jí)功能的應(yīng)用場(chǎng)景
- 中間件:處理HTTP請(qǐng)求和響應(yīng),如身份驗(yàn)證、日志記錄等。
- 信號(hào):實(shí)現(xiàn)應(yīng)用程序各個(gè)組件之間的通信。
- 緩存:提高應(yīng)用程序的性能,減少數(shù)據(jù)庫(kù)查詢。
- 表單驗(yàn)證:驗(yàn)證用戶輸入的數(shù)據(jù)。
- 權(quán)限管理:控制用戶對(duì)資源的訪問(wèn)權(quán)限。
33.2 中間件
33.2.1 什么是中間件
中間件是Django框架中的一個(gè)組件,用于處理HTTP請(qǐng)求和響應(yīng)。中間件可以在請(qǐng)求到達(dá)視圖函數(shù)之前或響應(yīng)返回客戶端之前執(zhí)行特定的操作。
33.2.2 自定義中間件
# myapp/middleware.py
from django.http import HttpResponse
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 請(qǐng)求到達(dá)視圖函數(shù)之前執(zhí)行的操作
print("請(qǐng)求到達(dá)視圖函數(shù)之前")
response = self.get_response(request)
# 響應(yīng)返回客戶端之前執(zhí)行的操作
print("響應(yīng)返回客戶端之前")
return response33.2.3 注冊(cè)中間件
# myproject/settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'myapp.middleware.SimpleMiddleware',
]33.3 信號(hào)
33.3.1 什么是信號(hào)
信號(hào)是Django框架中的一個(gè)組件,用于實(shí)現(xiàn)應(yīng)用程序各個(gè)組件之間的通信。當(dāng)某個(gè)事件發(fā)生時(shí),信號(hào)會(huì)發(fā)送一個(gè)通知,其他組件可以監(jiān)聽這個(gè)通知并執(zhí)行相應(yīng)的操作。
33.3.2 內(nèi)置信號(hào)
Django提供了多種內(nèi)置信號(hào),如:
django.db.models.signals.pre_save:在保存模型之前發(fā)送。django.db.models.signals.post_save:在保存模型之后發(fā)送。django.db.models.signals.pre_delete:在刪除模型之前發(fā)送。django.db.models.signals.post_delete:在刪除模型之后發(fā)送。
33.3.3 自定義信號(hào)
# myapp/signals.py import django.dispatch # 定義信號(hào) my_signal = django.dispatch.Signal()
33.3.4 發(fā)送信號(hào)
# myapp/views.py
from myapp.signals import my_signal
def my_view(request):
# 發(fā)送信號(hào)
my_signal.send(sender=my_view, message="Hello, World!")
return HttpResponse("信號(hào)已發(fā)送")33.3.5 接收信號(hào)
# myapp/receivers.py
from django.dispatch import receiver
from myapp.signals import my_signal
@receiver(my_signal)
def my_receiver(sender, **kwargs):
print("收到信號(hào)")
print("發(fā)送者:", sender)
print("參數(shù):", kwargs)33.3.6 注冊(cè)信號(hào)
# myapp/apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
import myapp.receivers33.4 緩存
33.4.1 什么是緩存
緩存是一種提高應(yīng)用程序性能的技術(shù),通過(guò)存儲(chǔ)經(jīng)常訪問(wèn)的數(shù)據(jù),減少數(shù)據(jù)庫(kù)查詢和計(jì)算的時(shí)間。Django提供了多種緩存后端,如Memcached、Redis等。
33.4.2 配置緩存
# myproject/settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
33.4.3 使用緩存
# myapp/views.py
from django.core.cache import cache
from django.http import HttpResponse
def my_view(request):
# 從緩存中獲取數(shù)據(jù)
data = cache.get('my_data')
if data is None:
# 緩存未命中,從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)
data = "Hello, World!"
# 將數(shù)據(jù)存入緩存,有效期為60秒
cache.set('my_data', data, 60)
return HttpResponse(data)33.5 表單驗(yàn)證
33.5.1 自定義表單驗(yàn)證
# myapp/forms.py
from django import forms
class MyForm(forms.Form):
name = forms.CharField(label='姓名', max_length=100)
email = forms.EmailField(label='郵箱')
def clean_name(self):
name = self.cleaned_data['name']
if len(name) < 2:
raise forms.ValidationError('姓名長(zhǎng)度不能少于2個(gè)字符')
return name
def clean_email(self):
email = self.cleaned_data['email']
if not email.endswith('@example.com'):
raise forms.ValidationError('郵箱必須以@example.com結(jié)尾')
return email33.5.2 使用表單驗(yàn)證
# myapp/views.py
from myapp.forms import MyForm
from django.shortcuts import render, redirect
def my_view(request):
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
return redirect('success')
else:
form = MyForm()
return render(request, 'myapp/my_form.html', {'form': form})33.6 權(quán)限管理
33.6.1 自定義權(quán)限
# myapp/models.py
from django.db import models
from django.contrib.auth.models import Permission
class MyModel(models.Model):
name = models.CharField(max_length=100)
class Meta:
permissions = [
('can_view', 'Can view my model'),
('can_edit', 'Can edit my model'),
('can_delete', 'Can delete my model'),
]33.6.2 分配權(quán)限
# myapp/admin.py
from django.contrib import admin
from myapp.models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
list_display = ['name']33.6.3 檢查權(quán)限
# myapp/views.py
from myapp.models import MyModel
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.can_view')
def my_view(request):
data = MyModel.objects.all()
return render(request, 'myapp/my_view.html', {'data': data})33.7 實(shí)戰(zhàn)案例:博客系統(tǒng)
33.7.1 需求分析
開發(fā)一個(gè)博客系統(tǒng),支持以下功能:
- 文章的CRUD操作。
- 文章分類管理。
- 評(píng)論管理。
- 權(quán)限管理。
33.7.2 代碼實(shí)現(xiàn)
33.7.2.1 數(shù)據(jù)模型
# myapp/models.py
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.author.username} - {self.article.title}"33.7.2.2 序列化器
# myapp/serializers.py
from rest_framework import serializers
from myapp.models import Category, Article, Comment
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = "__all__"
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = "__all__"
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = "__all__"33.7.2.3 視圖函數(shù)
# myapp/views.py
from rest_framework import viewsets, permissions
from rest_framework.authentication import TokenAuthentication
from myapp.models import Category, Article, Comment
from myapp.serializers import CategorySerializer, ArticleSerializer, CommentSerializer
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
class CommentViewSet(viewsets.ModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]33.7.2.4 路由配置
# myapp/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from myapp.views import CategoryViewSet, ArticleViewSet, CommentViewSet
router = DefaultRouter()
router.register(r"categories", CategoryViewSet)
router.register(r"articles", ArticleViewSet)
router.register(r"comments", CommentViewSet)
urlpatterns = [
path("", include(router.urls)),
]33.7.2.5 項(xiàng)目路由配置
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include("myapp.urls")),
]33.7.3 實(shí)施過(guò)程
- 安裝Django和Django REST framework。
- 創(chuàng)建項(xiàng)目和應(yīng)用。
- 定義數(shù)據(jù)模型。
- 編寫序列化器。
- 編寫視圖函數(shù)。
- 配置路由。
- 運(yùn)行應(yīng)用。
33.7.4 最終效果
通過(guò)博客系統(tǒng),我們可以實(shí)現(xiàn)以下功能:
- 文章的CRUD操作。
- 文章分類管理。
- 評(píng)論管理。
- 權(quán)限管理。
總結(jié)
? 本文詳細(xì)介紹了Python Web框架Django的高級(jí)技巧,包括中間件、信號(hào)、緩存、表單驗(yàn)證、權(quán)限管理等;學(xué)習(xí)了Django的高級(jí)功能;通過(guò)實(shí)戰(zhàn)案例實(shí)現(xiàn)了博客系統(tǒng)。
? 建議讀者在學(xué)習(xí)過(guò)程中多練習(xí),通過(guò)編寫代碼加深對(duì)知識(shí)點(diǎn)的理解。
到此這篇關(guān)于Python開發(fā)從入門到精通:Web框架Django高級(jí)應(yīng)用實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Python Web框架Django高級(jí)應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python的Web框架Django介紹與安裝方法
- Python web框架(django,flask)實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫分離的示例
- python web框架 django wsgi原理解析
- Python Web框架之Django框架Model基礎(chǔ)詳解
- Python Web框架之Django框架文件上傳功能詳解
- Python Web框架之Django框架Form組件用法詳解
- Python之Web框架Django項(xiàng)目搭建全過(guò)程
- Linux系統(tǒng)上Nginx+Python的web.py與Django框架環(huán)境
- python常用web框架簡(jiǎn)單性能測(cè)試結(jié)果分享(包含django、flask、bottle、tornado)
- 全面解讀Python Web開發(fā)框架Django
相關(guān)文章
Python讀取含url圖片鏈接的txt文檔方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了三種Python讀取含url圖片鏈接的txt文檔方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
Python pycharm 同時(shí)加載多個(gè)項(xiàng)目的方法
今天小編就為大家分享一篇Python pycharm 同時(shí)加載多個(gè)項(xiàng)目的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
ChatGPT教你用Python實(shí)現(xiàn)BinarySearchTree詳解
這篇文章主要為大家介紹了ChatGPT教你用Python實(shí)現(xiàn)BinarySearchTree詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
python2.6.6如何升級(jí)到python2.7.14
這篇文章主要為大家詳細(xì)介紹了python2.6.6如何升級(jí)到python2.7.14,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04

