一、Django 基础概念
Django 是什么 ?
Django 是一个基于 Python 的开源 Web 应用框架,采用了 MTV(Model - Template - View)软件设计模式 ,由许多功能强大的组件组成,能够帮助开发者快速、高效地创建复杂的数据库驱动的 Web 应用程序。它具有以下显著特点:
- 强大的数据库抽象层(ORM):允许使用 Python 代码与各种数据库进行交互,无需编写原始 SQL 语句。通过简单的配置就可以轻松更换数据库,实现数据模型与数据库的解耦,例如从 SQLite 切换到 PostgreSQL ,只需要在
settings.py
中修改数据库配置部分。
丰富的插件和工具:有大量的第三方插件,如用于用户认证的django - allauth
,文件管理的django - storages
,缓存的django - cache - utils
等,可以方便地集成到项目中,极大地提高开发效率。
-
内置的管理界面:只需简单配置,就能自动生成一个功能强大的后台管理界面,用于管理数据库中的数据。例如,在
admin.py
中注册模型类,就可以在管理界面中对该模型的数据进行增删改查操作。 -
安全机制:提供了一系列的安全防护机制,如防止跨站请求伪造(CSRF)、SQL 注入攻击、密码哈希等。默认开启的 CSRF 保护,会在表单提交等操作时验证请求的来源,防止恶意请求。
-
优雅的 URL 设计:通过
urls.py
文件,可以灵活地定义 URL 模式,并将其映射到相应的视图函数或类。例如,可以定义形如path('blog/<int:post_id>/', views.post_detail, name='post - detail')
的 URL,其中<int:post_id>
是一个动态参数,用于获取特定文章的详情。 -
模板系统:使用简单且强大的模板语言,能够方便地将数据渲染到 HTML 页面中。模板中可以使用变量、标签、过滤器等,如
{ { article.title }}
用于显示文章标题,{% if user.is_authenticated %}
用于判断用户是否登录等。
Django 的流程和命令行工具
# 安装 Django
pip3 install django
# 添加环境变量(一般在 Linux 或 macOS 系统中,安装后会自动配置,Windows 可能需要手动配置 Python 路径)
# 1. 创建 Django 项目
# 使用 django-admin 命令创建名为 mysite 的项目
django-admin startproject mysite
# 进入项目目录
cd mysite
# 2. 创建 Django 应用
# 方法一:使用 manage.py 脚本创建名为 app_name 的应用
python manage.py startapp app_name
# 方法二:使用 django-admin 命令创建名为 app_name 的应用
django-admin startapp app_name
# 3. settings.py 配置
# 打开 settings.py 文件进行配置
# 模板配置
# 通常 TEMPLATES 已经有默认配置,可根据需要修改
# TEMPLATES 是一个列表,包含模板引擎的配置信息
# 示例:
# 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',
# ],
# },
# },
# ]
# 静态文件配置
import os
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "statics"), # 静态文件存放目录
)
STATIC_URL = '/static/' # 静态文件访问的 URL 前缀
# 我们在模板中使用 STATIC_URL 来引用静态文件,Django 会根据 STATICFILES_DIRS 查找实际文件
# 4. 根据需求设计代码
# 在项目的 urls.py 中配置 URL 路由
# 示例:
# from django.contrib import admin
# from django.urls import path, include
# urlpatterns = [
# path('admin/', admin.site.urls),
# path('', include('app_name.urls')), # 包含 app_name 应用的 URL 配置
# ]
# 在 app_name 应用的 views.py 中编写视图函数
# 示例:
# from django.http import HttpResponse
# def index(request):
# return HttpResponse('Hello, World!')
# 5. 使用模板
# 在视图函数中使用 render 函数渲染模板
# 示例:
# from django.shortcuts import render
# def index(request):
# return render(request, "index.html")
# 6. 启动项目
# 使用 manage.py 脚本启动开发服务器,监听 127.0.0.1:8090 地址
python manage.py runserver 127.0.0.1:8090
# 7. 连接数据库,操作数据
# 在 app_name 应用的 models.py 中定义数据模型
# 示例:
# from django.db import models
# class Book(models.Model):
# title = models.CharField(max_length=100)
# author = models.CharField(max_length=100)
# 生成同步数据库的脚本
python manage.py makemigrations
# 同步数据库,将模型映射到数据库中
python manage.py migrate
# 清空数据库,删除所有数据并重置序列
python manage.py flush
# 注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把 migrations 目录下的脚本(除 __init__.py 之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。
# 8. 查询某个命令的详细信息
# 使用 django-admin 命令查看 startapp 命令的详细信息
django-admin help startapp
# admin 是 Django 自带的一个后台数据库管理系统,可通过以下步骤使用:
# 1. 在 settings.py 中确保 INSTALLED_APPS 包含 'django.contrib.admin'
# 2. 在 urls.py 中添加 admin 路由:path('admin/', admin.site.urls)
# 3. 创建超级用户:python manage.py createsuperuser
# 4. 启动开发服务器,访问 /admin 登录后台管理系统
HTTP 请求方式,在 Django 中的应用场景
常见的 HTTP 请求方式有 GET、POST、PUT、DELETE、OPTIONS 等,在 Django 中的应用场景如下:
GET:用于从服务器获取资源,请求参数会附加在 URL 后面。在 Django 中,常用于查询数据,如获取文章列表、用户信息等。例如,在视图函数中可以这样处理 GET 请求:
from django.http import JsonResponse
from .models import Article
def article_list(request):
articles = Article.objects.all()
data = [{
'title': article.title, 'content': article.content} for article in articles]
return JsonResponse(data, safe=False)
这里通过Article.objects.all()
获取所有文章,然后将文章数据以 JSON 格式返回。
POST:用于向服务器提交数据,通常用于创建新资源或更新现有资源。在 Django 中,常用于处理表单提交、文件上传等操作。比如处理用户注册表单:
from django.shortcuts import render, redirect
from .forms import UserRegistrationForm
def register(request):
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
form.save()
return redirect('login')
else:
form = UserRegistrationForm()
return render(request, 'register.html', {
'form': form})
这里当请求方法为 POST 时,验证并保存用户注册表单数据。
PUT:用于更新服务器上的资源,通常需要在请求体中包含完整的资源数据。在 Django 中,使用 PUT 请求更新数据时,一般会先获取要更新的对象,然后更新其属性并保存。例如:
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
from .models import Article
@csrf_exempt
def article_update(request, article_id):
try:
article = Article.objects.get(id=article_id)
data = json.loads(request.body)
article.title = data.get('title', article.title)
article.content = data.get('content', article.content)
article.save()
return JsonResponse({
'message': '文章更新成功'})
except Article.DoesNotExist:
return JsonResponse({
'message': '文章不存在'}, status=404)
这里通过@csrf_exempt
装饰器跳过 CSRF 验证(在实际生产中需要更安全的处理方式),获取请求体中的数据更新文章。
DELETE:用于删除服务器上的资源。在 Django 中,通过视图函数获取要删除的对象并调用其delete()
方法即可。例如:
from django.http import JsonResponse
from .models import Article
def article_delete(request, article_id):
try:
article = Article.objects.get(id=article_id)
article.delete()
return JsonResponse({
'message': '文章删除成功'})
except Article.DoesNotExist:
return JsonResponse({
'message': '文章不存在'}, status=404)
OPTIONS:用于获取服务器支持的 HTTP 请求方法等信息。在 Django 中,可以通过自定义视图函数来处理 OPTIONS 请求,返回服务器支持的方法列表等信息。例如:
from django.http import HttpResponse
from django.views.decorators.http import require_http_methods
@require_http_methods(['OPTIONS'])
def article_options(request):
allowed_methods = ['GET', 'POST', 'PUT', 'DELETE']
response = HttpResponse()
response['Allow'] = ', '.join(allowed_methods)
return response
这里定义了一个视图函数,返回当前资源支持的 HTTP 请求方法。
Django请求的生命周期
- wsgi, 对于浏览器来说,它就是socket服务端,用于接收用户请求并将请求进行初次封装,然后交给web框架(Flask、Django)
- 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session
- 路由匹配
- 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染
- 中间件,对响应的数据进行处理。
- wsgi,将响应的内容发送给浏览器。
一个 HTTP 请求在 Django 框架中的处理流程如下:
客户端发送请求:用户在浏览器中输入 URL 或通过其他客户端工具发送 HTTP 请求到 Django 应用服务器。
WSGI 服务器接收请求:Django 应用通过 WSGI(Web Server Gateway Interface)服务器(如 Gunicorn、uWSGI 等)接收请求。WSGI 服务器将请求封装成 Django 能够处理的格式,并传递给 Django。
中间件处理请求:请求会依次经过 Django 的中间件。中间件可以对请求进行预处理,如添加日志记录、验证用户身份、处理跨站请求伪造(CSRF)保护等。每个中间件都可以对请求进行修改或终止请求的处理。例如,Django 内置的CsrfViewMiddleware
中间件会验证请求中的 CSRF 令牌,防止 CSRF 攻击。
URL 路由匹配:Django 根据urls.py
文件中定义的 URL 模式,对请求的 URL 进行匹配。找到对应的视图函数或类视图,并将请求传递给它们。例如,在urls.py
中定义:
from django.urls import path
from .views import article_list, article_detail
urlpatterns = [
path('articles/', article_list, name='article-list'),
path('articles/<int:article_id>/', article_detail, name='article-detail'),
]
当请求的 URL 为/articles/
时,会调用article_list
视图函数;当 URL 为/articles/1/
时,会调用article_detail
视图函数,并将article_id
参数传递给它。
5. 视图函数处理请求:视图函数接收请求后,根据业务逻辑进行处理。可能会调用模型从数据库中获取数据,进行计算、验证等操作,然后选择合适的模板进行渲染。例如在article_detail
视图函数中:
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_detail(request, article_id):
article = get_object_or_404(Article, id=article_id)
return render(request, 'article_detail.html',