Django 基础使用
Django 基础使用
第一章:Django 简介
背景和发展历程:
Django 是一个开放源代码的 Web 应用框架,由 Lawrence Journal-World 开发并于 2005 年发布。最初是为了满足新闻网站的需求而开发的,后来成为一个功能强大且灵活的 Web 开发框架。Django 得到了全球开发者的广泛认可和使用,目前被许多知名网站和公司所采用。
选择 Django 的原因:
- 高效易用:Django 遵循"快速开发"的原则,提供了许多现成的工具和功能,使开发者能够快速构建功能完善的 Web 应用。
- 完善的文档和社区支持:Django 拥有丰富的官方文档和活跃的社区,开发者可以轻松获取帮助和资源。
- 丰富的功能模块:Django 内置了许多常用的功能模块,如用户认证、管理后台、表单处理等,减少了开发工作量。
- 安全性强:Django 具有内置的安全机制,能够有效防范常见的 Web 安全漏洞,如 SQL 注入、跨站脚本等。
- 可扩展性好:Django 支持各种第三方插件和扩展,可以根据项目需求灵活扩展功能。
核心特点和优势:
- MTV 架构:Django 采用了 MTV(Model-Template-View)的设计模式,将应用程序分为模型、模板和视图三层,使代码结构清晰,易于维护。
- 强大的 ORM:Django 的 ORM(对象关系映射)提供了方便的数据库操作方式,使开发者能够通过 Python 代码操作数据库,而无需编写 SQL 语句。
- 自动化 Admin 后台:Django 自带了一个强大的 Admin 后台管理工具,可以方便地管理网站内容和数据。
- 灵活的 URL 配置:Django 的 URL 配置非常灵活,可以通过简单的配置实现 URL 与视图函数的映射关系,支持正则表达式等高级匹配方式。
- 模板系统:Django 的模板系统简单易用,支持模板继承、过滤器、标签等功能,使前端开发更加高效。
- 安全性:Django 内置了一些安全特性,如跨站请求伪造(CSRF)保护、XSS(跨站脚本攻击)防护等,帮助开发者构建安全的 Web 应用。
第二章:环境搭建与项目创建
环境搭建:
安装 Python:Django 是基于 Python 的,首先确保你的计算机上安装了 Python(推荐使用最新稳定版)。
安装 Django:打开命令行(Windows 用户可以使用 cmd 或 PowerShell,Mac/Linux 用户使用终端),输入以下命令安装 Django:
安装数据库驱动:根据你的项目需求选择数据库,如 PostgreSQL、MySQL 或 SQLite。安装相应的数据库驱动,如:
pip install psycopg2-binary (for PostgreSQL) pip install mysqlclient (for MySQL) pip install django.db.backends.sqlite3 (for SQLite)设置环境变量:确保 Python 可执行路径在系统环境变量中,或者在命令行中使用
python而不是python3。
创建第一个 Django 项目:
使用命令行,进入你希望存放项目的文件夹:
cd /path/to/your/project/folder运行 Django 命令创建项目:
django-admin startproject my_first_django_project这将创建一个名为
my_first_django_project的文件夹,其中包含了基本的 Django 项目结构。
Django 项目的基本结构和文件目录: 一个典型的 Django 项目结构包括以下主要文件和目录:
- my_first_django_project:项目根目录,包含项目的配置文件和管理工具。
- my_first_django_project/settings.py:项目设置文件,包含各种配置信息。
- my_first_django_project/urls.py:项目 URL 配置文件,定义了应用的 URL 结构。
- my_first_django_project/wsgi.py:Web 服务器接口,用于将请求传递给 Django。
- my_first_django_project/migrations:数据库迁移目录,用于管理数据库结构的变更。
- my_first_django_project/static:静态文件目录,存放 CSS、JavaScript 等资源。
- my_first_django_project/templates:模板目录,用于存放 HTML 和模板文件。
- my_first_django_project/manage.py:项目管理工具,用于执行各种管理任务。
在my_first_django_project 文件夹中,通常会有一个或多个应用(app),每个应用有自己的文件结构,但基本结构相似,包含模型(model.py)、视图(views.py)、模板(templates)和 URL 配置(urls.py)等。通过startapp 命令可以创建新的应用。
创建项目后,启动开发服务器:
python manage.py runserver
然后在浏览器中访问http://127.0.0.1:8000/,你应该能看到 Django 的欢迎页面,表示项目已经成功创建并运行。
第三章:模型层(Model)
概念和作用:
在 Django 中,模型是与数据库交互的核心部分,用于定义数据结构和数据之间的关系。每个模型类对应数据库中的一张表,每个模型类的属性对应表中的字段。通过模型,可以轻松地进行数据库操作,包括创建、读取、更新和删除数据。
定义模型类和字段:
创建应用:首先,在 Django 项目中创建一个应用(app),使用
manage.py的startapp命令。定义模型类:在应用中的
models.py文件中定义模型类,每个类对应一个数据表。from django.db import models class Product(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=8, decimal_places=2) description = models.TextField() created_at = models.DateTimeField(auto_now_add=True)字段类型:Django 提供了多种字段类型,如
CharField(字符型)、IntegerField(整型)、DecimalField(十进制数)、TextField(文本型)、DateTimeField(日期时间型)等,适用于不同类型的数据。字段选项:每个字段可以使用各种选项来定义其行为,如
max_length(最大长度)、default(默认值)、unique(唯一性)、auto_now_add(自动添加当前时间)等。
Django 的 ORM 及使用方法:
ORM 概念:对象关系映射(ORM)是一种编程技术,将数据库表映射为对象,使开发者可以通过面向对象的方式操作数据库,而无需直接编写 SQL 语句。
模型操作:通过模型类可以执行各种数据库操作,如创建新数据、查询数据、更新数据和删除数据。
创建数据:
product = Product(name='Phone', price=999.99, description='Smartphone') product.save()查询数据:
products = Product.objects.all() # 查询所有数据 product = Product.objects.get(id=1) # 根据条件查询单个数据更新数据:
product = Product.objects.get(id=1) product.price = 899.99 product.save()删除数据:
product = Product.objects.get(id=1) product.delete()
查询集(QuerySet) :查询操作返回的是查询集,可以对查询集进行进一步筛选、排序和限制。
products = Product.objects.filter(price__gte=500) # 价格大于等于500的产品 products = products.order_by('-price') # 按价格降序排序 products = products[:5] # 只取前5个产品关联关系:通过外键(ForeignKey)和多对多字段(ManyToManyField)可以定义模型之间的关联关系,实现数据表之间的关联。
class Category(models.Model): name = models.CharField(max_length=50) class Product(models.Model): name = models.CharField(max_length=100) category = models.ForeignKey(Category, on_delete=models.CASCADE)迁移操作:每当更改模型类时,需要生成并应用迁移以更新数据库结构。
python manage.py makemigrations python manage.py migrate
通过模型定义和 ORM 操作,开发者可以轻松地管理和操作数据库中的数据,实现数据持久化和交互。
第四章:视图层(View)
作用和功能:
在 Django 中,视图层是处理用户请求的核心部分,它负责接收来自客户端的请求,处理业务逻辑,然后将结果呈现给用户。视图的主要功能包括接收请求参数、调用模型进行数据处理、执行逻辑操作、以及决定如何响应用户(如渲染模板,返回 JSON 数据等)。
编写视图函数处理用户请求:
定义视图函数:在
views.py中,创建一个函数来处理特定的 HTTP 请求(如 GET、POST 等)。from django.shortcuts import render from .models import Product def product_list(request): products = Product.objects.all() return render(request, 'product_list.html', {'products': products})接收请求参数:视图函数可以接收
request对象,该对象包含了用户请求的所有信息,如 GET 参数、POST 数据等。调用模型:视图可以调用模型的方法来获取数据或执行其他操作。
响应生成:视图函数通常会返回一个响应,可能是 HTML 模板、JSON 数据、重定向等。
视图的装饰器和通用视图的应用:
装饰器:Django 提供了许多装饰器来增强视图的功能,如
login_required(需要登录)、permission_required(需要特定权限)等。例如,限制只有管理员才能访问某个视图:from django.contrib.auth.decorators import login_required @login_required def admin_view(request): # ...通用视图:Django 提供了一些高级视图,如
ListView、DetailView、CreateView、UpdateView、DeleteView等,用于处理常见的 CRUD(创建、读取、更新和删除)操作。这些视图简化了视图的编写,只需要定义一些额外的参数和模型关系,如:from django.views.generic import ListView class ProductListView(ListView): model = Product template_name = 'product_list.html'
通用视图通常与模板和 URL 配置结合使用,提供了一种更为模块化的开发方式。
通过视图层,你可以将业务逻辑与 HTTP 请求分离,使得代码更易于理解和维护。同时,装饰器和通用视图的使用可以提高开发效率和代码的重用性。
第五章:模板层(Template)
基本语法和特性:
Django 模板语言是一种轻量级的模板语言,用于在 HTML 中嵌入动态数据和逻辑。基本语法包括变量、标签和过滤器:
- 变量:用
{{ variable }}表示,用于在模板中插入动态数据。 - 标签:用
{% tag %}表示,用于控制模板的逻辑,如 if 语句、for 循环等。 - 过滤器:用
{{ variable|filter }}表示,用于对变量进行处理,如格式化日期、字符串截取等。
使用模板渲染数据:
创建模板文件:在
templates目录下创建 HTML 文件,编写模板代码。传递数据:在视图函数中将数据传递给模板进行渲染。
from django.shortcuts import render def product_list(request): products = Product.objects.all() return render(request, 'product_list.html', {'products': products})渲染模板:在模板中使用变量和标签来展示数据。
<ul> {% for product in products %} <li>{{ product.name }}</li> {% endfor %} </ul>
模板继承、过滤器和标签的使用方法:
模板继承 :可以通过继承基础模板来重用通用的页面结构,子模板可以覆盖或扩展父模板的内容。例如,创建一个基础模板
base.html:<!DOCTYPE html> <html> <head> <title>{% block title %}My Site{% endblock %}</title> </head> <body> {% block content %} {% endblock %} </body> </html>子模板可以继承并覆盖父模板的内容:
{% extends 'base.html' %} {% block title %}Product List{% endblock %} {% block content %} <ul> {% for product in products %} <li>{{ product.name }}</li> {% endfor %} </ul> {% endblock %}过滤器:Django 提供了许多内置的过滤器,用于对数据进行处理和格式化。例如,将日期格式化为
YYYY-MM-DD:<p>{{ product.created_at|date:"Y-m-d" }}</p>标签:Django 模板标签用于控制模板的逻辑流程,如 if 语句、for 循环等。例如,使用 if 标签根据条件显示不同内容:
{% if product.price > 100 %} <p>Expensive</p> {% else %} <p>Affordable</p> {% endif %}
模板层是将动态数据呈现给用户的重要部分,模板继承、过滤器和标签的灵活运用可以使模板更具可复用性和可维护性,同时提升用户体验。
第六章:路由与 URL 配置
URLconf 的概念和作用:
URLconf(URL configuration)是 Django 中用于配置 URL 模式和视图函数映射关系的机制。它定义了用户访问网站时不同 URL 路径应该由哪个视图函数来处理。URLconf 通常由项目级别的 URLconf 和应用级别的 URLconf 组成,通过 URL 模式来匹配用户请求的 URL,并将其分发给相应的视图函数处理。
配置 URL 模式和视图函数的映射关系:
项目级别 URLconf:在项目的
urls.py文件中配置项目级别的 URL 模式。from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('products/', include('products.urls')), ]应用级别 URLconf:在应用的
urls.py文件中配置应用级别的 URL 模式,并指定对应的视图函数。from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('product/<int:product_id>/', views.product_detail, name='product_detail'), ]视图函数:在应用的
views.py文件中编写视图函数来处理用户请求,并返回相应的响应。from django.shortcuts import render from django.http import HttpResponse from .models import Product def index(request): return render(request, 'index.html') def product_detail(request, product_id): product = Product.objects.get(id=product_id) return render(request, 'product_detail.html', {'product': product})
正则表达式在 URL 配置中的应用:
在 URLconf 中,可以使用正则表达式来匹配更复杂的 URL 模式,以满足特定的路由需求。例如,使用正则表达式匹配特定格式的商品 ID:
from django.urls import path
from . import views
urlpatterns = [
path('product/(?P<product_id>\d+)/', views.product_detail, name='product_detail'),
]
在上面的例子中,(?P<product_id>\d+)部分使用了正则表达式,匹配一个或多个数字作为商品 ID,并将匹配到的内容作为product_id 参数传递给视图函数。
正则表达式的灵活性使得我们可以更精确地定义 URL 模式,实现更复杂的路由规则,从而提高网站的灵活性和可扩展性。
第七章:Admin 后台管理
Django 提供的 Admin 后台管理功能:
Django 提供了强大的 Admin 后台管理功能,可以让开发者方便地管理网站的数据,包括对数据库中的模型进行增删改查操作。Admin 后台管理界面自动生成,可以自定义显示的字段、过滤器、搜索框等,同时也提供了权限管理功能,可以控制不同用户的访问权限。
自定义 Admin 后台界面:
注册模型到 Admin 后台:在应用的
admin.py文件中注册需要管理的模型。from django.contrib import admin from .models import Product admin.site.register(Product)自定义 Admin 后台显示:可以通过在模型的 Admin 类中定义
list_display、list_filter、search_fields等属性来自定义 Admin 后台界面的显示。from django.contrib import admin from .models import Product @admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display = ('name', 'price', 'stock') list_filter = ('category',) search_fields = ('name', 'description')
在 Admin 后台管理数据库中的数据:
- 登录 Admin 后台:在浏览器中访问
/admin路径,并使用超级用户账号登录。 - 查看数据:在 Admin 后台界面中,可以看到注册的模型,点击进入相应的模型管理页面,可以查看、添加、编辑、删除数据库中的数据。
- 添加数据:在模型管理页面中,点击“Add”按钮,填写相应字段的数值,然后保存即可添加数据。
- 编辑数据:在模型管理页面中,点击数据行右侧的“Change”按钮,修改相应字段的数值,然后保存即可编辑数据。
- 删除数据:在模型管理页面中,勾选要删除的数据行左侧的复选框,然后点击页面底部的“Delete selected”按钮,确认删除即可删除数据。
通过 Admin 后台管理功能,开发者可以方便地管理数据库中的数据,快速进行数据的增删改查操作,提高开发效率和管理便利性。
第八章:表单处理与验证
Django 表单的概念和作用:
在 Web 开发中,表单是用户与网站进行交互的重要方式,用户可以通过表单向网站提交数据。Django 的表单功能可以帮助开发者快速创建表单、处理用户提交的数据,并进行验证。表单类定义了表单的字段和验证规则,可以在前端页面渲染表单,接收用户输入的数据,然后进行处理和验证。
创建表单类和处理用户提交的表单数据:
创建表单类:在 Django 应用中的
forms.py文件中定义表单类,继承自forms.Form或forms.ModelForm。from django import forms class ContactForm(forms.Form): name = forms.CharField(label='Your Name', max_length=100) email = forms.EmailField(label='Your Email') message = forms.CharField(widget=forms.Textarea)渲染表单到前端页面:在视图函数中实例化表单类,并传递给前端页面进行渲染。
from django.shortcuts import render from .forms import ContactForm def contact_view(request): form = ContactForm() return render(request, 'contact.html', {'form': form})处理用户提交的表单数据:在视图函数中通过
POST请求获取用户提交的数据,实例化表单类并传入request.POST,然后进行数据验证和处理。def contact_view(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): # 处理有效的表单数据 else: # 处理表单验证失败的情况 else: form = ContactForm() return render(request, 'contact.html', {'form': form})
表单验证和错误处理的方法:
- 表单验证 :Django 的表单类提供了各种字段验证器,可以在字段定义时设置验证规则,也可以在表单类中定义
clean_<field_name>()方法进行自定义验证。 - 错误处理:在前端页面中可以通过
{{ form.field_name.errors }}显示字段验证错误信息,也可以通过{{ form.non_field_errors }}显示表单级别的错误信息。在视图函数中,可以通过form.errors获取所有错误信息。
通过 Django 的表单处理与验证功能,开发者可以轻松创建表单、处理用户提交的数据,并进行有效的数据验证和错误处理,保证用户输入的数据符合要求,提高网站的安全性和用户体验。
第九章:用户认证与权限控制
Django 中用户认证和权限控制的机制:
Django 框架内置了一套用户认证系统,提供了用户注册、登录、注销、权限控制等功能。用户认证系统主要包括 User 模型、用户组(Groups)、权限(Permissions)等概念。
- User 模型:Django 内置的
User模型定义了用户的基本信息,如用户名、密码、邮箱等。可以通过django.contrib.auth.get_user_model()获取用户模型,以便在应用中使用。 - 用户注册:通过定义一个表单类来处理用户注册时提交的数据,然后在视图函数中实例化该表单,并验证用户输入的数据。注册成功后,可以将用户数据保存到数据库中。
- 用户登录:登录过程包括验证用户名和密码。Django 提供了
authenticate()函数来验证用户身份,验证成功后,可以使用login()函数将用户登录状态保存在会话(Session)中。 - 用户注销:用户注销功能可以通过
logout()函数实现,该函数会清除用户会话中的信息,从而结束用户的登录状态。 - 权限控制:Django 通过用户、用户组、权限三者之间的关系来实现权限控制。权限分为对象权限和组权限,用户可以通过加入用户组来获得组权限,也可以直接分配对象权限。
如何实现用户注册、登录和注销功能:
- 用户注册:创建一个注册表单,并在视图函数中处理表单提交的数据,验证无误后保存用户信息到数据库,并创建用户会话。
- 用户登录:创建一个登录表单,并在视图函数中处理表单提交的数据,验证用户身份后使用
login()函数保存登录状态。 - 用户注销:在视图函数中实现注销逻辑,调用
logout()函数清除会话信息。
如何管理用户权限和角色:
- 用户组管理:通过 Django 的管理界面可以创建和管理用户组,并为用户分配组成员身份。
- 权限分配:在 Django 中,权限可以通过模型权限和中间件权限两种方式进行分配。模型权限关联到 Django 的模型上,中间件权限是全局的权限,可以被特定的用户或用户组继承。
- 权限验证:在视图函数中,可以通过
has_perm()方法来检查用户是否有执行某操作的权限,也可以在模板中通过{% if user.has_perm('app_label.model_name') %}来判断权限。
通过 Django 的用户认证与权限控制机制,开发者可以为网站提供安全、灵活的用户管理方案,确保只有授权用户才能访问特定的资源和操作,从而保护网站的数据和功能安全。
第十章:RESTful API 开发
RESTful API 的概念和设计原则:
REST(Representational State Transfer)是一种设计风格,用于构建分布式系统和网络应用。RESTful API 是符合 REST 架构风格的 API,具有以下设计原则:
- 基于资源:将数据和功能看作资源,每个资源通过唯一的 URL 进行标识。
- 统一接口:使用统一的接口进行交互,如 HTTP 方法(GET、POST、PUT、DELETE 等)。
- 无状态性:每个请求都包含足够的信息来处理,服务器不保存客户端的状态。
- 资源关系:通过 URL 表示资源之间的关系,如嵌套 URL 表示资源之间的层级关系。
- 状态转移:客户端通过操作资源的表现形式来进行状态转移,如 GET 获取资源、POST 创建资源等。
如何使用 Django REST framework 构建 API 接口:
- 安装 Django REST framework:通过 pip 安装
djangorestframework库。 - 创建序列化器(Serializers):定义资源的序列化和反序列化规则。
- 创建视图集(ViewSets):定义处理 API 请求的视图集,包括列表、详情、创建、更新、删除等操作。
- 配置 URL 路由:将视图集映射到 URL,并配置路由。
- 配置权限和认证:通过 Django REST framework 提供的权限和认证类来控制 API 的访问权限。
API 的认证、权限控制和版本管理:
- 认证:Django REST framework 提供了多种认证方式,如基本认证、Token 认证、Session 认证、JWT 认证等。可以在视图或全局配置中设置认证类。
- 权限控制:通过 Django REST framework 提供的权限类来控制用户对 API 资源的访问权限,如 IsAuthenticated、IsAdminUser、AllowAny 等。
- 版本管理:可以通过 URL 版本控制或 Accept 头部版本控制来管理 API 的版本。在 Django REST framework 中,可以使用
rest_framework.versioning模块来实现版本管理。
通过使用 Django REST framework 构建 RESTful API,可以快速、灵活地开发 API 接口,提供给前端应用或第三方服务使用。同时,通过认证、权限控制和版本管理,可以确保 API 的安全性和稳定性,为用户提供良好的使用体验。
第十一章:性能优化与安全防护
常见的性能优化技巧和最佳实践:
- 缓存:使用缓存可以减少数据库查询和计算量,提高应用的性能。可以使用 Django 缓存框架来实现缓存,如 Memcached、Redis、FileBasedCache 等。
- 静态文件:使用 CDN(内容分发网络)来加速静态文件的访问,减少服务器压力。
- 数据库优化:使用数据库索引、分表、分库等技术来优化数据库性能。
- 异步处理:将一些耗时的操作放到异步队列中处理,避免阻塞主线程。
- 代码优化:使用 Django 调试工具和 Python profiler 来分析代码的性能瓶颈,进行优化。
防范常见的 Web 安全攻击:
- SQL 注入:使用参数化查询和预编译语句来防止 SQL 注入攻击。
- XSS:使用 Django 的安全过滤器和 CSP(内容安全策略)来防止 XSS 攻击。
- CSRF:使用 Django 的 CSRF 保护机制来防止 CSRF 攻击。
- Clickjacking:使用 X-Frame-Options 头部和 Frame-Ancestors CSP 指令来防止 Clickjacking 攻击。
- DoS/DDoS:使用流量控制和限速来防止 DoS/DDoS 攻击。
对 Django 应用进行性能测试和安全审计:
- 性能测试:使用 Django 调试工具和 Python profiler 来分析代码的性能瓶颈,进行优化。可以使用 Apache Benchmark(ab)、Locust 等工具来进行性能测试。
- 安全审计:使用 Django 的安全过滤器和 Python 安全工具库来检查代码的安全性,进行修复。可以使用 OWASP ZAP、Burp Suite 等工具来进行安全审计。
通过对 Django 应用进行性能优化和安全防护,可以确保应用的高性能和安全性,为用户提供良好的使用体验。同时,通过定期的性能测试和安全审计,可以及时发现和修复潜在的问题,提高应用的稳定性和可靠性。
常见问题:
Q:如何处理 Django 中的大文件上传?
A:可以使用 Django 的 FileField 配合如
django-storages库(如 Amazon S3、Google Cloud Storage 等)处理大文件存储。Q:如何在 Django 中实现用户权限管理?
A:使用 Django 的内置权限系统(如
permissions模块)或第三方库如django-guardian进行更细粒度的权限控制。Q:如何处理数据库迁移问题?
A:确保每次改动数据库结构后,使用
makemigrations、migrate和syncdb正确地更新迁移文件,并在生产环境中使用--fake选项模拟迁移。