【Django精通秘籍】:5小时速成Python Web开发专家
发布时间: 2024-10-01 04:03:09 阅读量: 19 订阅数: 23
![【Django精通秘籍】:5小时速成Python Web开发专家](https://ngangasn.com/wp-content/uploads/2022/12/How-to-use-named-URLs-in-Django-reverse-and-get_absolute_url-methods.png)
# 1. Django框架简介与安装配置
## Django框架简介
Django是一个由Python编写的高级Web框架,它鼓励快速开发和干净、实用的设计。Django遵循MVC(模型-视图-控制器)架构模式,并将其扩展为MTV(模型-模板-视图)以适应Web开发。它内置了大量实用工具和功能,如认证、内容管理、站点地图等,使得开发复杂的、数据库驱动的网站变得简单。
## 安装Django
为了开始使用Django,首先需要安装Python。安装Python后,使用pip包管理器安装Django。通过命令行执行以下命令来安装Django:
```bash
pip install django
```
安装完成后,可以通过运行以下命令来验证Django是否正确安装:
```bash
django-admin --version
```
## 创建与配置Django项目
创建一个新的Django项目非常简单。使用django-admin工具,可以快速初始化项目结构:
```bash
django-admin startproject myproject
```
这将创建一个名为`myproject`的新目录,其中包含项目的基本文件。然后,可以使用以下命令启动项目的开发服务器,以便在本地测试:
```bash
cd myproject
python manage.py runserver
```
这将在默认的端口8000上启动开发服务器。在浏览器中访问 `***` 来查看Django欢迎页面,确认安装和配置成功。
Django的安装与配置是开发的第一步。本章介绍了Django框架的基本概念,并指导了如何进行安装和初始配置,为后续的开发工作打下了基础。接下来的章节将深入探讨Django的核心概念,如模型、视图、模板等。
# 2. Django模型与数据库操作
### 2.1 Django模型基础
#### 2.1.1 模型的定义和字段类型
在Django中,模型(Model)代表了数据库中的表,用于定义数据的结构,同时提供了丰富的API用于数据库操作。Django的模型是Python类,继承自`django.db.models.Model`,每个模型类的属性代表了数据库表中的一列,而这些属性就是字段(Field)。每个字段类型都由一个Field类的子类表示,例如`CharField`用于存储字符串,`IntegerField`用于存储整数等。
下面是创建模型的一个简单示例:
```python
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
class Book(models.Model):
title = models.CharField(max_length=200)
publish_date = models.DateField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)
```
在这个例子中,`Author`模型有四个字段:`name`、`age`、`email`和`is_active`。`Book`模型则包含了三个字段:`title`、`publish_date`和一个外键`author`指向`Author`模型。
Django为字段类型提供了许多参数来定义字段的行为,如`max_length`、`unique`、`default`等,这些参数有助于确保数据的完整性和符合预期的数据库行为。
#### 2.1.2 数据库迁移与操作
Django通过迁移(Migrations)文件来管理数据库的变更。每次对模型做出修改(如添加、删除字段或模型),都需要生成一个迁移文件来描述这些变更。然后,通过执行迁移命令,Django能够应用这些变更到数据库中。
迁移操作一般包括以下几个步骤:
1. 修改模型文件。
2. 运行`python manage.py makemigrations`生成迁移文件。
3. 运行`python manage.py migrate`将迁移应用到数据库。
对于数据库操作,Django ORM提供了非常丰富的API来查询和操作数据。例如,查询所有作者:
```python
authors = Author.objects.all()
```
更新作者的名字:
```python
author = Author.objects.get(id=1)
author.name = 'New Name'
author.save()
```
删除作者:
```python
author = Author.objects.get(id=1)
author.delete()
```
Django的ORM系统抽象了数据库的底层细节,使得数据库操作更加直观和简单。开发者不需要编写原始SQL语句,就可以完成复杂的数据查询和操作。
### 2.2 Django ORM的强大功能
#### 2.2.1 查询集(QuerySet)的使用
Django ORM的核心概念之一是查询集(QuerySet),它是一个可以获取数据库中记录集的对象。QuerySet支持链式操作,并且可以表达出非常复杂的查询条件。
例如,获取所有年龄大于30岁的作者:
```python
older_authors = Author.objects.filter(age__gt=30)
```
获取所有活跃且名字为'John'的作者:
```python
active_johns = Author.objects.filter(is_active=True, name='John')
```
获取图书列表,按出版日期降序排列:
```python
books = Book.objects.order_by('-publish_date')
```
查询集支持使用`|`和`&`操作符来组合查询条件,分别代表SQL中的`OR`和`AND`:
```python
young_or_active_authors = Author.objects.filter(age__lt=30) | Author.objects.filter(is_active=True)
```
除了这些基本的查询操作,Django ORM还支持聚合函数、分组、相关数据加载等高级功能。这些操作极大地简化了开发者对数据库的访问和操作。
#### 2.2.2 关联数据的操作与优化
Django通过外键(ForeignKey)、一对一(OneToOneField)和多对多(ManyToManyField)字段类型支持关系型数据库中的关联数据操作。这些关系字段使得在查询相关联的记录时非常方便。
例如,获取某个作者的图书:
```python
author = Author.objects.get(name='John Doe')
author_books = author.book_set.all()
```
在上面的例子中,`author.book_set`是由Django自动创建的一个反向关系管理器,可以直接访问与作者相关联的所有图书。
为了优化数据库查询,Django提供了`select_related`和`prefetch_related`方法。`select_related`用于SQL JOIN查询,一次性获取相关联的数据,适用于一对一和多对一的关系。而`prefetch_related`用于处理多对多和反向的一对多关系,它通过单独的查询来获取相关对象,然后在Python中进行组合,减少了数据库的查询次数。
例如,获取所有作者及其图书的优化查询:
```python
authors = Author.objects.select_related('book_set')
```
这将减少数据库查询次数,提高数据检索效率。
### 2.3 高级数据库技巧
#### 2.3.1 事务处理与数据库锁定
在某些情况下,需要确保一系列数据库操作要么全部成功,要么全部回滚,这时就需要用到数据库事务。Django提供了事务装饰器和上下文管理器来控制事务。
使用装饰器控制事务:
```python
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# 这个代码块在事务中执行
pass
```
使用上下文管理器控制事务:
```python
from django.db import transaction
def viewfunc(request):
with transaction.atomic():
# 这个代码块在事务中执行
pass
```
事务处理确保了数据的一致性,同时,Django还支持数据库级别的锁定。在高并发的环境中,可以使用`select_for_update()`来锁定选中的记录,直到事务结束。
#### 2.3.2 数据库索引与性能优化
为了提升查询性能,数据库索引是不可或缺的。在Django中,可以在模型的字段上添加`db_index=True`来创建索引。
```python
class Author(models.Model):
name = models.CharField(max_length=100, db_index=True)
...
```
在执行如下的查询时,会使用索引:
```python
Author.objects.filter(name='John')
```
除了手动创建索引,还可以使用Django的`.optimize()`方法来优化数据库表,这个方法在不同的数据库后端上表现不同,但在一些数据库上,它可以重建索引和执行其他数据库维护任务。
此外,Django还提供了数据分页(pagination)和查询集缓存(queryset caching)等优化技巧,以提高应用程序的性能。
## 总结
在本章节中,我们深入探讨了Django模型与数据库操作的基础知识以及高级技巧。从模型的定义、字段类型到数据库迁移和操作,再到Django ORM的强大查询集功能,以及关联数据的操作与优化,再到事务处理、数据库锁定和索引优化等高级数据库技巧。通过本章的内容,读者可以掌握Django在数据库层面的实践操作与优化手段。在下一章节,我们将继续深入Django的核心组件,探讨视图和URL设计的艺术。
# 3. Django视图和URL设计
## 3.1 视图的创建与处理流程
在Django Web应用中,视图是处理用户请求的核心。在这一部分,我们将深入探讨如何创建和处理Django视图,以及基本视图和类视图之间的区别和联系。
### 3.1.1 基本视图与类视图
Django 提供了两种创建视图的方式:基本视图和类视图。基本视图简单直接,适用于简单的请求和响应处理。而类视图则使用面向对象的编程范式,便于重用和组织代码。
#### 基本视图
基本视图是函数形式的视图。它们直接返回HTTP响应,对于简单的操作,这种形式非常直观和便捷。以下是一个简单的基本视图示例:
```python
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello, world!")
```
当用户访问这个视图的URL时,它会返回一个简单的“Hello, world!”文本。
#### 类视图
类视图是继承自`View`的Python类。它们通常处理一个特定HTTP方法,如GET、POST等。使用类视图的一个好处是可以轻松地处理不同HTTP请求类型。
```python
from django.views import View
from django.http import HttpResponse
class HelloWorldView(View):
def get(self, request, *args, **kwargs):
return HttpResponse("Hello, world!")
```
在这个例子中,`HelloWorldView`是一个处理GET请求的类视图,它返回同样的“Hello, world!”文本。
### 3.1.2 请求与响应对象
无论是使用基本视图还是类视图,所有的视图都处理着一个共同的对象——`request`。`request`对象包含了所有关于客户端请求的信息,如请求的类型、参数、用户信息等。
而`response`对象则代表了视图将返回给客户端的数据。Django提供了不同类型的响应对象,如`HttpResponse`、`JsonResponse`等。视图根据不同的业务需求返回不同的响应对象。
#### 示例代码
下面的类视图处理了GET请求,并返回了一个HTML页面。
```python
from django.views import View
from django.http import HttpResponse
from django.template import loader
class MyView(View):
def get(self, request, *args, **kwargs):
template = loader.get_template('my_template.html')
context = {'name': 'World'}
return HttpResponse(template.render(context, request))
```
在这个例子中,首先加载了一个模板文件,然后创建了一个包含数据的上下文,并通过`template.render`方法将它渲染到HTML中,最后返回了一个渲染好的HTML响应。
### 总结
在本小节中,我们了解了Django视图创建与处理的基本概念和实现方式。基本视图和类视图各有其用武之地,开发者可以根据项目需求和自身的喜好来选择使用。我们还探讨了如何使用`request`对象来获取请求信息,并通过`response`对象返回数据。
在下一小节中,我们将探讨URL路由的艺术,包括如何设计一个清晰、易维护的URL路由结构,以及如何处理动态URL和捕获组。
# 4. Django模板与前端开发
## 4.1 模板系统基础
### 4.1.1 模板标签与过滤器
Django模板系统的核心是其标签(Tags)和过滤器(Filters),它们使得模板能够执行逻辑判断和循环控制,同时能够对变量进行格式化处理。模板标签类似于编程中的函数,而过滤器则类似于对数据的处理函数。
```django
{% if user.is_authenticated %}
<p>Hi {{ user.username }}. Thanks for logging in.</p>
{% endif %}
```
在上述代码中,`{% if %}` 是一个模板标签,用于判断条件。`{{ user.username }}` 是一个变量,而 `|upper` 是一个过滤器,用于将变量的输出转换为大写形式。
### 4.1.2 模板继承与包含
模板继承机制是Django模板系统中一个十分有用的特性,它允许我们创建一个基础模板,并且定义一些可以被子模板覆盖的区域。`{% block %}` 标签用于定义这些可覆盖的区域。
```django
<!-- base.html -->
<html>
<head>
<title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
```
子模板通过继承这个基础模板来复用其结构和样式:
```django
{% extends "base.html" %}
{% block title %}My Blog{% endblock %}
{% block content %}
<h1>My Blog</h1>
<!-- content goes here -->
{% endblock %}
```
## 4.2 高级模板技术
### 4.2.1 模板中的自定义标签和过滤器
为了满足特定需求,Django允许开发者创建自定义的模板标签和过滤器。通过创建自定义模板库来实现这一点。
首先在你的应用目录下创建一个 `templatetags` 文件夹,在其中创建一个 `__init__.py` 文件来初始化模块,然后创建另一个 `custom_tags.py` 文件用于存放自定义的模板标签。
```python
from django import template
register = template.Library()
@register.simple_tag
def hello(name):
return "Hello, " + name + "!"
@register.filter(name='upper')
def upper_case(value):
return value.upper()
```
在模板中使用自定义标签和过滤器:
```django
{% load custom_tags %}
<p>{% hello user_name %}</p>
<p>{{ user_name|upper }}</p>
```
### 4.2.2 模板加载的高级配置
Django模板的加载配置提供了灵活性。可以在设置文件中配置模板引擎,指定模板文件的查找路径等。
```python
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
```
`DIRS` 指定了自定义模板文件的位置,`APP_DIRS` 设置为 `True` 表示应用内部的 `templates` 目录也会被当作模板的查找路径。
## 4.3 前端开发的最佳实践
### 4.3.1 Django与前端框架的整合
Django和前端框架如React或Vue.js可以一起使用,创建更动态的Web应用。前端框架通常由Node.js构建工具如Webpack打包处理。
在Django中整合React通常涉及在Django项目中安装 `django-js-reverse`,它可以帮助在React中管理URL。
```shell
pip install django-js-reverse
```
然后在 `urls.py` 中配置:
```python
from django.urls import include, path
from js_reverse.views import urls_js
urlpatterns = [
path('jsreverse/', include(urls_js)),
]
```
在React中使用生成的URL:
```javascript
import { routerShape } from 'react-router';
import js_reverse from 'django-js-reverse';
let url = js_reverse.reverse('name-of-view');
```
### 4.3.2 前端资源管理和优化
前端资源包括JavaScript、CSS以及图片等静态文件。Django通过 `django-static-url` 库可以帮助管理和优化这些资源。
在 `settings.py` 文件中配置:
```python
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
```
使用Django的 `collectstatic` 命令,可以收集所有静态文件到指定目录。
```shell
python manage.py collectstatic
```
为了提高前端资源加载速度,可以使用缓存以及压缩工具如 `django-compressor`。安装后,配置 `settings.py`:
```python
INSTALLED_APPS = [
...
'compressor',
]
COMPRESS_PRECOMPILERS = (
('text/x-scss', 'django_libsass.SassCompiler'),
)
COMPRESS_CSS_FILTERS = ['compressor.filters.css_default.CssAbsoluteFilter', 'compressor.filters.cssmin.rCSSMinFilter']
```
在模板中使用压缩过的CSS和JS文件:
```django
{% load compress %}
{% compress css %}
<link href="{{ STATIC_URL }}css/mysite.css" rel="stylesheet">
{% endcompress %}
```
通过以上这些方法,你可以更好地利用Django模板和前端技术,使你的Web应用具有更丰富的用户体验和更高效的资源加载。
# 5. Django表单与用户认证
表单和用户认证是Web应用中不可或缺的部分,它们确保用户可以与应用进行互动并且安全地处理敏感数据。本章节将深入探讨Django表单的处理流程、用户认证系统,以及一些高级表单与认证技巧。
## 5.1 表单的处理流程
表单是Web应用中用于收集用户输入的一种方式。Django提供了一个强大、灵活的表单系统,可以处理数据的渲染、验证和错误处理。
### 5.1.1 表单类的定义与使用
在Django中,创建表单的基本方法是定义一个继承自`django.forms.Form`的类,并指定表单字段。例如,创建一个简单的登录表单:
```python
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label='用户名', max_length=100)
password = forms.CharField(label='密码', widget=forms.PasswordInput)
```
这个`LoginForm`类定义了两个字段:`username`和`password`。`label`参数指定了字段旁边的标签文字,`max_length`设置了输入字符的最大长度,而`widget`参数指定了使用密码输入控件。
### 5.1.2 表单验证与错误处理
验证是确保表单数据符合预期格式的过程。Django表单提供内置的验证机制,可以在实例化表单时调用`is_valid()`方法进行验证。
```python
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
# 此处处理有效数据
pass
else:
# 此处处理验证失败的情况
print(form.errors)
else:
form = LoginForm()
return render(request, 'login.html', {'form': form})
```
在上面的例子中,如果表单数据验证失败,可以通过`form.errors`访问错误信息。这些错误信息是针对每个字段的字典,可以用来通知用户需要更正的数据。
## 5.2 用户认证系统详解
Django内置了一个用户认证系统,它包括用户模型、认证后端和一个用于登录、注销和管理用户的视图和表单的框架。
### 5.2.1 用户登录与注册流程
Django的认证系统包括`AuthenticationForm`用于处理登录,以及`UserCreationForm`用于注册新用户。
```python
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
# 登录逻辑
pass
else:
form = AuthenticationForm()
return render(request, 'login.html', {'form': form})
def user_register(request):
if request.method == 'POST':
form = UserCreationForm(data=request.POST)
if form.is_valid():
# 注册逻辑
pass
else:
form = UserCreationForm()
return render(request, 'register.html', {'form': form})
```
### 5.2.2 权限控制与会话管理
Django的认证系统通过会话(session)来管理登录状态,并提供了装饰器如`login_required`来控制访问权限。
```python
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
def secret_page(request):
return render(request, 'secret.html')
```
这个装饰器确保只有登录用户才能访问`secret_page`视图。
## 5.3 高级表单与认证技巧
随着项目复杂度的增加,可能会需要对Django的表单和认证系统进行定制和扩展。
### 5.3.1 自定义用户模型与扩展
Django允许使用自定义用户模型以适应特定需求。通过继承`AbstractUser`或`AbstractBaseUser`并指定`AUTH_USER_MODEL`设置,可以实现这一点。
```python
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
age = models.IntegerField(null=True)
```
### 5.3.2 第三方认证与OAuth
随着应用的发展,集成第三方认证服务如Facebook、Google、Twitter等能极大增加用户体验。Django可以使用像`django-allauth`这样的包来集成OAuth认证。
```python
# 示例配置 django-allauth
AUTHENTICATION_BACKENDS = [
# 其他认证方式...
'allauth.account.auth_backends.AuthenticationBackend',
]
INSTALLED_APPS = [
# 其他应用...
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.google',
]
SOCIALACCOUNT.providers.google.key = 'your-app-id'
SOCIALACCOUNT.providers.google.secret = 'your-app-secret'
```
通过上述配置,可以启用第三方认证提供者的支持,极大简化了用户的注册和登录流程。
通过以上介绍,我们了解了Django中表单和用户认证的基础知识,以及如何进行定制和扩展,以满足更为复杂的应用需求。在接下来的第六章,我们将探究如何将这些知识应用于一个进阶项目中,实现实用的功能和优化。
# 6. Django进阶项目实战
在前面章节中,我们已经深入探讨了Django框架的核心组件和操作。现在让我们将理论知识转化为实践经验,一起动手实施一个进阶项目实战。
## 6.1 实战项目架构设计
在本节中,我们将从零开始构建一个具有模块化设计和RESTful接口的Django项目。
### 6.1.1 应用的模块化与RESTful设计
在构建大型Web应用时,良好的模块化是保证代码可维护性和扩展性的关键。Django应用(App)的模块化允许我们将功能划分为独立的模块,每个模块负责不同的业务逻辑。
首先,我们创建新的应用模块。假设我们要构建一个博客系统,我们可以创建如下模块:
- 用户认证模块(users)
- 文章模块(posts)
- 评论模块(comments)
每个模块都将是Django中的一个独立应用,并且在创建时,Django允许我们通过`--template`参数指定模板,例如:
```bash
django-admin startapp posts --template=***
```
然后,我们使用RESTful架构风格设计API接口。RESTful API关注的是资源的设计,使用HTTP方法来表示对资源的操作:
- GET请求用于获取资源列表或单个资源
- POST请求用于创建新资源
- PUT请求用于更新现有资源
- DELETE请求用于删除资源
我们可以在项目的`urls.py`文件中定义相应的路由规则:
```python
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r'posts', views.PostViewSet)
urlpatterns = [
path('', include(router.urls)),
# 其他URL配置
]
```
### 6.1.2 项目配置与环境优化
在开发过程中,我们将需要各种配置,例如数据库设置、静态文件配置、安全设置等。这些配置通常位于项目的`settings.py`文件中。一个好的实践是将这些配置分离为不同的文件,通过环境变量来引用,便于在不同的环境间切换,如开发环境、测试环境和生产环境。
在Django项目根目录下创建一个`.env`文件,存储环境变量:
```
DEBUG=True
DJANGO_SECRET_KEY='your-secret-key'
DATABASE_URL='sqlite:///your-database.db'
```
然后,使用Python包`django-environ`来加载这些环境变量。在`settings.py`中:
```python
import environ
env = environ.Env()
DEBUG = env('DEBUG')
SECRET_KEY = env('DJANGO_SECRET_KEY')
DATABASES = {
'default': env.db()
}
# 其他配置...
```
通过环境变量来管理配置,我们能确保敏感信息的安全,并且在不同环境中轻松切换配置。
## 6.2 复杂功能实现与优化
### 6.2.1 分页、搜索与筛选
对于内容繁多的Web应用来说,分页是必须具备的功能。在Django中,我们可以使用内置的分页工具`django.core.paginator`来实现分页。
创建一个视图来展示文章列表,加上分页功能:
```python
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def post_list(request):
post_list = Post.objects.all()
paginator = Paginator(post_list, 10) # Show 10 posts per page
page = request.GET.get('page', 1)
try:
posts = paginator.page(page)
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
return render(request, 'posts/post_list.html', {'posts': posts})
```
在前端模板中,我们还需要添加分页控件,允许用户切换不同的页面。
搜索和筛选功能的实现会依赖于用户的输入,并根据输入来过滤数据。例如,在文章列表视图中添加搜索功能:
```python
# 添加在Post.objects.all()之前
posts = posts.filter(title__icontains=search_input)
```
### 6.2.2 性能优化与缓存应用
性能优化是提高Web应用响应速度和用户体验的关键。Django提供了多级缓存机制来帮助我们提升性能。缓存可以应用于视图、查询集或模板输出。
在视图层面,我们可以使用简单的缓存装饰器:
```python
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 缓存15分钟
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'posts/post_detail.html', {'post': post})
```
更复杂的性能优化可能涉及数据库查询优化,如使用select_related和prefetch_related来减少数据库查询次数。
## 6.3 项目部署与持续集成
### 6.3.1 部署前的准备与策略
在将项目部署到生产环境之前,我们需要确保遵循一系列最佳实践,包括但不限于:
- 代码审查
- 安全检查
- 压缩静态文件
- 数据库迁移
- 依赖项更新
使用`django-admin check`命令检查潜在问题,然后运行数据库迁移:
```bash
python manage.py migrate
```
为了减少生产环境中的静态文件体积,我们可以使用Gulp、Webpack等工具来压缩和合并JavaScript、CSS文件。然后,配置Web服务器(如Nginx或Apache)来托管静态文件。
### 6.3.2 持续集成工具的配置与使用
持续集成(Continuous Integration,CI)是开发中常用的一种实践,它允许我们频繁地集成代码到主分支上。在项目中加入CI可以自动化测试、构建和部署流程。
可以使用Jenkins、Travis CI或GitHub Actions等工具配置CI流程。以GitHub Actions为例,创建一个`.github/workflows`目录,在其中添加一个YAML文件来定义工作流程:
```yaml
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.8, 3.9, 3.10]
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install Django
- name: Run tests
run: |
python manage.py test
```
在此工作流程中,每次推送到仓库或创建拉取请求时,GitHub Actions会自动执行测试,确保项目质量。
在本章中,我们已介绍了Django项目从设计到部署的进阶实战技巧。通过这些实践,您将能构建出更健壮、可维护且性能优异的Django Web应用。
0
0