第二章:Django的深度潜行

安装Django - 装备你的船

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

pip install django

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

django-admin startproject myproject
cd myproject
python manage.py runserver

Django的基础 - 船体构造

1. 项目结构解析

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

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

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

  • 创建一个视图:
from django.http import HttpResponse

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

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

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

创建一个简单的模型:

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:创建应用
python manage.py startapp blog
  • 步骤 2:注册应用

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

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

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

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能够存储博客文章。

python manage.py makemigrations blog
python manage.py migrate
  • 步骤 5:创建视图

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

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文件。这是你的视图模板。

DOCTYPE html>
<html>
<head>
    <title>Blogtitle>
head>
<body>
    <h1>Blog Postsh1>
    <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配置:

from django.urls import include

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

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

from django.urls import path
from . import views

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

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

进阶航行 - 拓展你的海域

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

在Django的世界里,表单就像是捕捉海风的风帆,帮助你有效地捕获和利用用户输入的数据。
Django的表单系统提供了一种高效的方法来创建表单,并自动处理数据验证。以下是如何创建一个基于模型的表单:

  • 定义表单:

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

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属性指定了哪些模型字段应包含在表单中。

  • 使用表单:

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

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)中,你可以渲染这个表单:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submitbutton>
form>

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

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

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

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

  • 安装 Django REST框架:

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

pip install djangorestframework
  • 配置:

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

INSTALLED_APPS = [
    ...
    'rest_framework',
]
  • 定义序列化器:

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

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框架提供的视图和序列化器:

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配置中:

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 %} 标签:

<form method="post">
    {% csrf_token %}
    
form>

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

  • SQL注入防护:

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

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

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

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

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

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

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

  • 查询优化:

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

posts = BlogPost.objects.select_related().all()
  • 缓存:

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

在 settings.py 中设置缓存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

在视图中使用缓存:

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都是一艘值得信赖的伙伴。祝你一帆风顺!

你可能感兴趣的:(探索Python,Web框架的多彩世界,数据库,django,sqlite)