1. Django入门作业解析:从零搭建第一个Web应用
刚接触Django框架时,第一次作业往往让人既兴奋又困惑。作为Python最流行的Web框架之一,Django以"全能型选手"著称,但它的完整功能栈也意味着更高的学习门槛。我在指导团队新人时发现,90%的初期问题都源于对基础概念的理解偏差。下面就以典型的首次Django作业为例,拆解每个关键环节的技术要点。
1.1 环境准备与项目初始化
首先需要明确的是Python环境隔离的重要性。很多新手直接在本机Python环境安装Django,后期会出现依赖冲突问题。推荐使用venv创建虚拟环境:
bash复制python -m venv django_env
source django_env/bin/activate # Linux/Mac
django_env\Scripts\activate.bat # Windows
安装Django时要注意版本匹配问题。目前LTS版本是4.2.x,但教学环境可能还在用3.2系列。建议使用指定版本安装:
bash复制pip install django==3.2.18
创建项目的命令看似简单,但有个关键细节容易被忽略:
bash复制django-admin startproject mysite
这里的mysite是项目容器名称,它会生成一个同名的Python包。我见过有学生用django作为项目名,导致后续导入混乱。最佳实践是使用config作为项目目录名:
bash复制django-admin startproject config .
注意:结尾的点号表示在当前目录创建,避免产生嵌套的项目目录结构
1.2 应用(APP)创建与配置
Django的模块化设计体现在"应用"概念上。创建第一个应用的正确姿势是:
bash复制python manage.py startapp blog
此时项目结构应该如下:
code复制config/
blog/
migrations/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
manage.py
关键步骤是在config/settings.py中注册应用。新手常犯的错误是直接写blog,实际上应该使用应用配置类的路径:
python复制INSTALLED_APPS = [
...
'blog.apps.BlogConfig',
]
1.3 模型设计与数据库迁移
第一次作业通常会要求创建简单的数据模型。比如构建一个博客文章模型:
python复制from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
生成迁移文件并应用变更:
bash复制python manage.py makemigrations
python manage.py migrate
这里有个实用技巧:在开发阶段可以使用python manage.py showmigrations查看迁移状态,用python manage.py sqlmigrate blog 0001查看具体的SQL语句。
1.4 管理员界面配置
Django自带的管理后台是快速实现CRUD的利器。首先创建超级用户:
bash复制python manage.py createsuperuser
然后在blog/admin.py中注册模型:
python复制from django.contrib import admin
from .models import Post
admin.site.register(Post)
访问/admin时如果遇到"请输入正确的用户名和密码"提示,请注意:
- 用户名和密码区分大小写
- 确保用户已激活(
is_active=True) - 检查用户是否有
staff权限
1.5 视图与URL配置
基础视图函数示例:
python复制from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all()
return render(request, 'blog/post_list.html', {'posts': posts})
URL配置需要两级映射。首先在blog目录下创建urls.py:
python复制from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
]
然后在项目级的config/urls.py中包含应用URL:
python复制from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
1.6 模板系统使用
在blog目录下创建templates/blog/目录(注意双重目录结构),然后新建post_list.html:
html复制<!DOCTYPE html>
<html>
<head>
<title>My Blog</title>
</head>
<body>
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
<small>{{ post.created_at }}</small>
<hr>
{% endfor %}
</body>
</html>
模板加载需要在settings.py中配置APP_DIRS=True,同时建议设置DIRS为[BASE_DIR / 'templates']以便存放全局模板。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ORM查询实战技巧
Django ORM的强大之处在于能用Pythonic的方式操作数据库。以下是第一次作业常用的查询示例:
2.1 基础查询方法
python复制# 获取全部对象
Post.objects.all()
# 创建并保存新对象
new_post = Post(title='First Post', content='Hello Django')
new_post.save()
# 条件查询
Post.objects.filter(title__contains='Django')
# 排除查询
Post.objects.exclude(title__startswith='Test')
# 获取单个对象
Post.objects.get(id=1)
注意:
get()在找不到对象或找到多个对象时会抛出异常,适合在确定唯一性的场景使用
2.2 高级查询技巧
python复制# 链式查询
Post.objects.filter(created_at__year=2023).exclude(title='Draft')
# 字段查找
Post.objects.filter(created_at__gte='2023-01-01')
# 排序
Post.objects.order_by('-created_at')[:5] # 最新5篇
# 聚合查询
from django.db.models import Count
Post.objects.values('created_at__year').annotate(total=Count('id'))
2.3 删除操作注意事项
python复制# 删除单个对象
post = Post.objects.get(id=1)
post.delete()
# 批量删除
Post.objects.filter(title__startswith='Test').delete()
重要安全提示:在生产环境中执行删除操作前,务必:
- 先进行查询确认
- 考虑使用
is_active标记替代物理删除 - 实现备份机制
3. 用户认证系统解析
Django内置的认证系统是作业常见考点,以下是关键实现步骤:
3.1 用户模型扩展
python复制from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
bio = models.TextField(blank=True)
avatar = models.ImageField(upload_to='avatars/', blank=True)
需要在settings.py中指定自定义用户模型:
python复制AUTH_USER_MODEL = 'blog.CustomUser'
重要:此配置必须在首次迁移前设置,且后续不能修改
3.2 登录/注销视图
python复制from django.contrib.auth import login, logout
from django.contrib.auth.forms import AuthenticationForm
from django.shortcuts import render, redirect
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(request, data=request.POST)
if form.is_valid():
user = form.get_user()
login(request, user)
return redirect('post_list')
else:
form = AuthenticationForm()
return render(request, 'blog/login.html', {'form': form})
def logout_view(request):
logout(request)
return redirect('post_list')
3.3 权限控制
在视图函数中使用装饰器:
python复制from django.contrib.auth.decorators import login_required
@login_required
def draft_list(request):
posts = Post.objects.filter(is_draft=True)
return render(request, 'blog/draft_list.html', {'posts': posts})
模板中的权限检查:
html复制{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}!</p>
{% else %}
<a href="{% url 'login' %}">Log in</a>
{% endif %}
4. 常见问题排查指南
根据教学经验,首次Django作业的高频问题包括:
4.1 数据库连接失败
症状:执行migrate时出现django.db.utils.OperationalError
解决方案:
- 检查
settings.py中的DATABASES配置 - 确保数据库服务已启动
- 验证用户名/密码权限
4.2 模板找不到错误
症状:TemplateDoesNotExist异常
排查步骤:
- 确认
APP_DIRS=True - 检查模板路径拼写
- 确保
templates目录在正确位置
4.3 静态文件404
配置静态文件的正确方式:
python复制STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
开发阶段需要手动收集静态文件:
bash复制python manage.py collectstatic
4.4 CSRF验证失败
处理POST请求时出现403 Forbidden的解决方案:
- 模板中确保有
{% csrf_token %} - 视图使用
@csrf_exempt装饰器临时禁用(仅限测试) - 检查Cookies设置
5. 项目部署准备
虽然第一次作业通常不要求部署,但了解基本流程很有必要:
5.1 生产环境设置
关键配置调整:
python复制DEBUG = False
ALLOWED_HOSTS = ['yourdomain.com', 'localhost']
SECRET_KEY = os.environ.get('SECRET_KEY')
5.2 使用Gunicorn+NGINX
基本部署命令:
bash复制pip install gunicorn
gunicorn config.wsgi:application
NGINX配置示例:
code复制server {
listen 80;
server_name yourdomain.com;
location /static/ {
alias /path/to/staticfiles;
}
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
}
}
5.3 安全加固要点
- 禁用DEBUG模式
- 设置强SECRET_KEY
- 使用HTTPS
- 定期更新依赖
- 实施数据库备份
完成第一次Django作业后,建议尝试以下扩展练习:
- 添加评论功能
- 实现文章分页
- 开发REST API接口
- 编写单元测试
- 集成前端框架如Vue.js
记住,Django的学习曲线初期较陡,但一旦掌握其设计哲学,开发效率会大幅提升。每个成功的Django开发者都是从python manage.py runserver开始的。
