第二章:Django的深度潜行

安装Django - 装备你的船

在航向Django的旅程之前,你需要准备好你的船。安装Django就像给你的船装上发动机一样简单。

bash 复制代码
pip install django

安装完成后,你就可以创建你的第一个项目,也就是你的第一艘船:

bash 复制代码
django-admin startproject myproject
cd myproject
python manage.py runserver

Django的基础 - 船体构造

1. 项目结构解析

Django项目的结构就像船的框架。它有以下主要部分:

  • settings.py:船的控制台,你可以在这里调整航行设置(项目配置)。
  • urls.py:航海图,决定了航线(路由)。
  • views.py:船长的舱室,从这里指挥航行(处理请求)。
  • models.py:货舱,存储你的财宝(数据库模型)。
2. 视图与路由:掌舵手的艺术

在Django中,视图和路由协同工作,就像船上的掌舵手和航海图。

  • 创建一个视图:
python 复制代码
from django.http import HttpResponse

def home(request):
    return HttpResponse("Ahoy! Welcome to my Django ship!")
  • 定义路由:
python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]
3. 模型:货仓的组织

Django的模型是存储和管理数据的强大工具,就像船上整齐的货仓。

创建一个简单的模型:

python 复制代码
from datetime import datetime
from django.db import models


class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    published_date = models.DateTimeField(default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

    def __str__(self):
        return self.title
4. 示例:小型博客应用

创建一个简单的博客应用,可以让你理解Django的基本工作流程。你需要完成几个关键步骤:创建应用、注册应用、设置模型、迁移数据库、创建视图和模板,以及配置URLs。下面是详细的步骤:

  • 步骤 1:创建应用
bash 复制代码
python manage.py startapp blog
  • 步骤 2:注册应用

打开 myproject/settings.py 文件(这里 myproject 是你的项目名),并确保 'blog' 被包含在 INSTALLED_APPS 中,如下所示:

python 复制代码
INSTALLED_APPS = [
    # ... 其他已安装的应用 ...
    'blog',  # 确保这一行已添加
]
  • 步骤 3:定义模型

在blog/models.py文件中定义你的博客文章模型。例如:

python 复制代码
from datetime import datetime
from django.db import models


class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    published_date = models.DateTimeField(default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

    def __str__(self):
        return self.title
  • 步骤 4:迁移数据库

模型更改后,你需要迁移数据库,以便Django能够存储博客文章。

bash 复制代码
python manage.py makemigrations blog
python manage.py migrate
  • 步骤 5:创建视图

在blog/views.py文件中创建视图来显示文章。例如,你可以创建一个视图来列出所有博客文章:

python 复制代码
from django.shortcuts import render
from .models import BlogPost

def post_list(request):
    posts = BlogPost.objects.all().order_by('-published_date') 
    return render(request, 'blog/post_list.html', {'posts': posts})
  • 步骤 6:创建模板

在blog应用目录下创建一个名为templates的新文件夹,并在其内部创建一个名为blog的文件夹。然后,在blog/templates/blog目录中创建一个名为post_list.html的HTML文件。这是你的视图模板。

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Blog</title>
</head>
<body>
    <h1>Blog Posts</h1>
    <div>
        {% for post in posts %}
        <div>
            <h2>{{ post.title }}</h2>
            <p>{{ post.content }}</p>
            <p>Published on: {{ post.published_date }}</p>
        </div>
        {% endfor %}
    </div>
</body>
</html>
  • 步骤 7:配置URLs

首先,确保在项目的urls.py(位于myproject/urls.py)文件中包含了对你的应用的引用。在项目的urls.py中添加以下代码来引用博客应用的URL配置:

python 复制代码
from django.urls import include

urlpatterns = [
    # ... other url patterns ...
    path('blog/', include('blog.urls')),
]

然后在你的blog应用中创建一个urls.py文件,并设置路由到你的视图:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
]
  • 步骤 8:运行开发服务器
bash 复制代码
python manage.py runserver

现在,你可以在浏览器中访问http://127.0.0.1:8000/blog/来查看你的博客。你应该能看到一个列出所有博客文章的页面。

进阶航行 - 拓展你的海域

1. 表单和验证:抓住海风

在Django的世界里,表单就像是捕捉海风的风帆,帮助你有效地捕获和利用用户输入的数据。

Django的表单系统提供了一种高效的方法来创建表单,并自动处理数据验证。以下是如何创建一个基于模型的表单:

  • 定义表单:

你已经有一个BlogPost 模型,你想为它创建一个表单。在forms.py文件中(如果没有,就在应用目录下创建一个),定义你的表单:

python 复制代码
from django import forms
from .models import BlogPost

class BlogPostForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        fields = ['title', 'content']

在这里,BlogPostForm类继承自forms.ModelForm,它告诉Django你的这个表单是基于BlogPost模型的。Meta类中的fields属性指定了哪些模型字段应包含在表单中。

  • 使用表单:

在视图中,你可以使用这个表单来接收用户输入的数据,并进行处理。

python 复制代码
from django.shortcuts import render
from .forms import BlogPostForm

def post_new(request):
    if request.method == "POST":
        form = BlogPostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            # 可以添加更多处理,例如设置作者
            post.save()
            # 重定向到新的博客文章或其他页面
    else:
        form = BlogPostForm()
    return render(request, 'blog/post_edit.html', {'form': form})
  • 模板中的表单:

在你的模板文件(例如post_edit.html)中,你可以渲染这个表单:

html 复制代码
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

这里的{{ form.as_p }}会将表单字段渲染为包含在

标签中的HTML,而{% csrf_token %}则是为了防止跨站请求伪造。

2. Django REST框架:无线电通信

Django REST框架(DRF)是一个强大的工具,它允许你的Django应用通过RESTful API与外界进行通信。想象一下,这就像无线电,让你的船只能与远方的船只或岸上进行通信。

  • 安装 Django REST框架:

首先,你需要安装Django REST框架:

bash 复制代码
pip install djangorestframework
  • 配置:

然后,在你的settings.py文件中添加rest_framework到INSTALLED_APPS列表中。

python 复制代码
INSTALLED_APPS = [
    ...
    'rest_framework',
]
  • 定义序列化器:

序列化器用于定义如何将你的模型转换为JSON格式。在serializers.py文件中定义序列化器:

python 复制代码
from rest_framework import serializers
from .models import BlogPost

class BlogPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPost
        fields = ['id', 'title', 'content']
  • 创建API视图:

接下来,你可以创建一个API视图来展示你的博客文章。在你的views.py中,你可以使用Django REST框架提供的视图和序列化器:

python 复制代码
from rest_framework import generics
from .models import BlogPost
from .serializers import BlogPostSerializer

class BlogPostListCreate(generics.ListCreateAPIView):
    queryset = BlogPost.objects.all()
    serializer_class = BlogPostSerializer

在这个例子中,BlogPostListCreate是一个基于类的视图,它使用ListCreateAPIView来提供文章列表和创建新文章的功能。

  • 配置URL:

最后,将API视图添加到你的URL配置中:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('api/posts/', views.BlogPostListCreate.as_view(), name='post-list'),
]
3. 安全与性能:防波堤与引擎优化
3.1 安全性:确保你的船舶安全

在Django的航海世界中,安全性就像是船只的防波堤,保护着你的应用不受风浪的侵袭。Django自带了一系列安全功能,确保你的航行安全无忧。

  • CSRF保护:

跨站请求伪造(CSRF)是一种常见的网络攻击方式,Django通过中间件和模板标签提供了内置的CSRF保护。

每当你创建一个表单时,确保在模板中使用 {% csrf_token %} 标签:

html 复制代码
<form method="post">
    {% csrf_token %}
    <!-- 表单字段 -->
</form>

Django的CSRF中间件默认启用,确保你的 settings.py 文件中包含了 'django.middleware.csrf.CsrfViewMiddleware'。

  • SQL注入防护:

Django的ORM系统天生就是防范SQL注入攻击的,因为它避免了直接的SQL语句拼接,而是使用参数化查询。

使用Django的查询API而不是原生SQL可以自动保护你的应用:

python 复制代码
posts = BlogPost.objects.filter(title="Safe Sailing")
  • 密码安全:

Django对用户密码提供了强大的哈希和加密支持,确保用户信息的安全。

在创建用户模型时,使用Django内置的 User 模型,它自带密码哈希和验证机制。

3.2 性能优化:提升你的引擎性能

性能优化就像对船只的引擎进行升级,让你的应用能够更快、更高效地运行。

  • 查询优化:

使用 select_related 和 prefetch_related 来优化数据库查询,减少数据库访问次数:

python 复制代码
posts = BlogPost.objects.select_related().all()
  • 缓存:

使用Django的缓存框架可以显著提升性能,特别是对于静态数据或不经常变化的内容。

settings.py 中设置缓存:

python 复制代码
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

在视图中使用缓存:

python 复制代码
from django.core.cache import cache

def my_view(request):
    if cache.get('my_key'):
        # 缓存命中
        return cache.get('my_key')
    else:
        result = expensive_query()
        cache.set('my_key', result, 60 * 15)  # 缓存15分钟
        return result
  • 使用CDN和静态文件优化:

对于静态文件,考虑使用内容分发网络(CDN)来提升加载速度。

使用 django.contrib.staticfiles 来管理静态文件,确保在生产环境中使用压缩和最小化的资源。

结语:扬帆起航

现在你已经装备好你的Django船只,了解了如何建造船体、设置航线、装载货物,甚至进行了一次小型的航行演练。接下来的旅程完全取决于你------探索开阔的海洋,发现新的岛屿,或者与其他船只进行交流。记住,无论你的目的地在哪里,Django都是一艘值得信赖的伙伴。祝你一帆风顺!

相关推荐
一 乐3 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99996 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学37 分钟前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.40 分钟前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道1 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德2 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪2 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd