在航向Django的旅程之前,你需要准备好你的船。安装Django就像给你的船装上发动机一样简单。
pip install django
安装完成后,你就可以创建你的第一个项目,也就是你的第一艘船:
django-admin startproject myproject
cd myproject
python manage.py runserver
Django项目的结构就像船的框架。它有以下主要部分:
在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'),
]
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
创建一个简单的博客应用,可以让你理解Django的基本工作流程。你需要完成几个关键步骤:创建应用、注册应用、设置模型、迁移数据库、创建视图和模板,以及配置URLs。下面是详细的步骤:
python manage.py startapp blog
打开 myproject/settings.py 文件(这里 myproject 是你的项目名),并确保 ‘blog’ 被包含在 INSTALLED_APPS 中,如下所示:
INSTALLED_APPS = [
# ... 其他已安装的应用 ...
'blog', # 确保这一行已添加
]
在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
模型更改后,你需要迁移数据库,以便Django能够存储博客文章。
python manage.py makemigrations blog
python manage.py migrate
在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})
在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>
首先,确保在项目的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'),
]
python manage.py runserver
现在,你可以在浏览器中访问http://127.0.0.1:8000/blog/来查看你的博客。你应该能看到一个列出所有博客文章的页面。
在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 %}则是为了防止跨站请求伪造。
Django REST框架(DRF)是一个强大的工具,它允许你的Django应用通过RESTful API与外界进行通信。想象一下,这就像无线电,让你的船只能与远方的船只或岸上进行通信。
首先,你需要安装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视图来展示你的博客文章。在你的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来提供文章列表和创建新文章的功能。
最后,将API视图添加到你的URL配置中:
from django.urls import path
from . import views
urlpatterns = [
path('api/posts/', views.BlogPostListCreate.as_view(), name='post-list'),
]
在Django的航海世界中,安全性就像是船只的防波堤,保护着你的应用不受风浪的侵袭。Django自带了一系列安全功能,确保你的航行安全无忧。
跨站请求伪造(CSRF)是一种常见的网络攻击方式,Django通过中间件和模板标签提供了内置的CSRF保护。
每当你创建一个表单时,确保在模板中使用 {% csrf_token %} 标签:
<form method="post">
{% csrf_token %}
form>
Django的CSRF中间件默认启用,确保你的 settings.py 文件中包含了 ‘django.middleware.csrf.CsrfViewMiddleware’。
Django的ORM系统天生就是防范SQL注入攻击的,因为它避免了直接的SQL语句拼接,而是使用参数化查询。
使用Django的查询API而不是原生SQL可以自动保护你的应用:
posts = BlogPost.objects.filter(title="Safe Sailing")
Django对用户密码提供了强大的哈希和加密支持,确保用户信息的安全。
在创建用户模型时,使用Django内置的 User 模型,它自带密码哈希和验证机制。
性能优化就像对船只的引擎进行升级,让你的应用能够更快、更高效地运行。
使用 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)来提升加载速度。
使用 django.contrib.staticfiles 来管理静态文件,确保在生产环境中使用压缩和最小化的资源。
现在你已经装备好你的Django船只,了解了如何建造船体、设置航线、装载货物,甚至进行了一次小型的航行演练。接下来的旅程完全取决于你——探索开阔的海洋,发现新的岛屿,或者与其他船只进行交流。记住,无论你的目的地在哪里,Django都是一艘值得信赖的伙伴。祝你一帆风顺!