关于 Django
Django 是 Python 写的 Web 框架,把网站开发里 80% 的脏活——数据库连接、用户系统、后台管理——都替你写好了。Instagram、Pinterest、Mozilla 都是用它做的。
它的玩法很简洁:你声明有什么数据(模型)、什么 URL 对应什么页面(路由)、页面长什么样(模板),剩下交给它。
今天的任务,建一个 blog 项目,里面装一个 article 应用。下课前,浏览器里能打开自己的博客,看见自己刚刚填的几篇文章。
装框架
SSH 连上阿里云服务器(Windows 用 PowerShell / MobaXterm / PuTTY,Mac 直接用 Terminal),登录后执行:
# 国内网络慢的话用清华镜像
$ pip3 install django -i https://pypi.tuna.tsinghua.edu.cn/simple
# 验证:能看到版本号就装好了
$ python3 -m django --version
6.0.4
注意:阿里云服务器上 Python 3 命令叫
python3,pip 叫 pip3——别敲成 python 或 pip,那可能指向 Python 2。
建项目 blog
切换到放代码的目录,执行下面这几条:
# 切到放项目的目录(咱们统一放在 /home/django 下)
$ cd /home/django
# 创建一个 Django 项目,名为 blog
$ django-admin startproject blog
# 进入项目目录(往后所有命令都在这里执行)
$ cd blog
启动开发服务器
这一步有个坑:直接 runserver 在某些机房/校园网/虚拟机环境下会报 DisallowedHost 或者外部访问不到。稳妥的写法是显式指定监听地址:
# 监听本机所有网卡的 8000 端口(推荐这样写)
$ python3 manage.py runserver 0.0.0.0:8000
0.0.0.0 之后,Django 出于安全要求必须知道"哪些域名/IP 允许访问"。打开 blog/settings.py,找到 ALLOWED_HOSTS = [],改成:
# 课堂期间用 ['*'] 最省事,意思是"任何 host 都允许"
ALLOWED_HOSTS = ['*']
浏览器访问 http://127.0.0.1:8000/,看到绿色火箭🚀欢迎页,项目就跑起来了。
Ctrl+C。
项目结构(看一眼即可)
建应用 article
另开一个终端窗口(保持服务器一直跑),在 blog 目录下:
$ python3 manage.py startapp article
项目里多出 article/ 文件夹。关键:把这个应用注册到项目。打开 blog/settings.py,找到 INSTALLED_APPS,把 'article' 加到列表最后:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article', # ← 加这一行(前面 6 行别动)
]
写一个文章模型
模型就是用 Python 类描述一张数据库表。要存"文章",所以建一个 Article 类——每篇文章有标题、作者、正文、发布时间。
打开 article/models.py,写入:
from django.db import models
# 一个 class 对应一张数据库表
class Article(models.Model):
title = models.CharField('标题', max_length=200)
author = models.CharField('作者', max_length=50)
content = models.TextField('正文')
created = models.DateTimeField('发布时间', auto_now_add=True)
# 决定后台/打印时显示什么——这里显示标题
def __str__(self):
return self.title
把模型同步到数据库
模型只是 Python 代码,要让数据库里真的多出一张表,执行两条命令:
# Django 看一眼模型,生成"建表说明书"
$ python3 manage.py makemigrations
# 按说明书在数据库里真的建表
$ python3 manage.py migrate
db.sqlite3 文件,那就是你的数据库。这节课不用关心 SQL 怎么写,Django 全替你搞定了。
开个后台,添几篇文章
Django 最强的地方之一:不写一行前端代码,自动生成完整管理后台。三步:
第一步:建一个后台管理员账号
$ python3 manage.py createsuperuser
Username: admin
Email address: admin@blog.com
Password: ****** # 输入密码(屏幕不显示是正常的)
Password (again): ******
Superuser created successfully.
第二步:把 Article 模型挂到后台
打开 article/admin.py:
from django.contrib import admin
from .models import Article
admin.site.register(Article)
第三步:登录后台,添加 2~3 篇文章
浏览器打开 http://127.0.0.1:8000/admin/,用刚才的账号登录。点 ARTICLE → Articles → ADD ARTICLE,填几篇文章——这是后面前台要展示的内容。
让浏览器看到你的文章
到目前为止,文章是存在数据库里、藏在后台里的。现在要让普通用户访问 http://127.0.0.1:8000/article/ 就能看到一个文章列表页。
这件事 Django 把它拆成三个零件,一气呵成做完——
/article/ 时,交给哪个函数处理。视图:那个函数负责取数据,把数据交给模板。
模板:HTML 骨架,把数据填进占位符,浏览器看到的就是它。
动手前先看:要碰这 4 个文件
① 改 blog/urls.py —— 加一行
from django.contrib import admin
from django.urls import path, include # ← 多导入一个 include
urlpatterns = [
path('admin/', admin.site.urls),
path('article/', include('article.urls')), # ← 加这一行
]
含义:所有 /article/ 开头的请求,转交给 article 应用自己的路由表。
② 新建 article/urls.py —— 这个文件本来不存在
from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list), # /article/ → article_list 函数
]
③ 改 article/views.py —— 写一个函数
from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, 'article/list.html', {'articles': articles})
render 三件事:找模板 → 把 articles 填进去 → 返回 HTML 给浏览器。
④ 新建 article/templates/article/list.html
在 article 文件夹里建两层目录 templates/article/,里面建 list.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的博客</title>
<style>
body { font-family: sans-serif; max-width: 720px;
margin: 40px auto; padding: 0 20px; line-height: 1.7; }
article { padding: 14px 0; border-bottom: 1px solid #eee; }
.meta { color: #888; font-size: 0.9em; }
</style>
</head>
<body>
<h1>📝 我的博客</h1>
<!-- 循环:把视图传来的 articles 一篇篇渲染 -->
{% for article in articles %}
<article>
<h2>{{ article.title }}</h2>
<div class="meta">
作者:{{ article.author }} · {{ article.created|date:"Y-m-d H:i" }}
</div>
<p>{{ article.content }}</p>
</article>
{% endfor %}
</body>
</html>
{{ ... }} 是填值——把变量内容替换进去;{% ... %} 是逻辑——循环、判断、过滤器。这是 Django 模板语言唯一要记的两件事。
ImportError 直接挂掉——表现是终端"卡住",没反应。访问页面之前先按 Ctrl+C 干净停掉服务器,再重新启动:
python3 manage.py runserver 0.0.0.0:8000Starting development server at http://0.0.0.0:8000/ 这一行才算真启动了。
🎉 浏览器里访问
列表页:http://127.0.0.1:8000/article/
应该能看到刚才在后台填的文章一篇篇显示出来。
- settings.py 里
'article'加了吗?逗号呢?ALLOWED_HOSTS改了吗? makemigrations和migrate都跑过了吗?- 后台真的添加文章了吗?
- article 下面有
urls.py吗(这个文件需要你自己建)? - 模板路径是
article/templates/article/list.html吗(套两层文件夹)? - 服务器报红字了?看终端最后一行错误信息,往往就是答案。
📋 本节小结
四个零件的协作关系:
记住这 4 个高频命令
django-admin startproject <名字>— 建项目python3 manage.py startapp <名字>— 建应用python3 manage.py makemigrations然后migrate— 同步模型到数据库python3 manage.py runserver 0.0.0.0:8000— 启动服务器
课堂练习
点选项即时判分。两组从浅到深:先 Linux 命令,再 Django 概念。
命令行基础(6 题)
这一章用了好几条终端命令——cd、pwd、mkdir 这些是基础中的基础。Windows、Mac、Linux 命令名略有差异,但思路一样。
想知道当前在哪个文件夹下,应该用哪个命令?
从 /home/django/blog 切换到上一级目录 /home/django,用哪个命令?
.. 表示"上一级目录"。cd / 是切到根目录,cd 不带参数在 Linux 下是回家目录。想列出当前文件夹下所有内容,Linux/Mac 用 ls,Windows CMD 通常用什么?
dir,PowerShell 两个都能用(PowerShell 把 ls 设成了 dir 的别名)。第 6 步要建模板目录,命令应该是?
服务器跑起来后,按 Ctrl+C 可以彻底停掉服务器。
在终端里输入命令时,$ 或 > 是提示符,是终端自动显示的,不是你要敲进去的内容。
$,Windows CMD 是 >,PowerShell 是 PS>。讲义里写 $ pip3 install,你只需敲 pip3 install。Django 概念加深(6 题)
不是考代码,是考你真的理解了 Django 在干什么。做完这一组,下次自己写新功能就能自如。
关于"项目(project)"和"应用(app)"的关系,下列哪个说法是对的?
本章 class Article(models.Model) 这个模型类,对应数据库里的什么?
makemigrations 和 migrate 的区别?
为什么 Django 后台 /admin/ 能自动给 Article 模型生成"添加文章"的表单?
SQLite 需要单独装一个数据库服务(像 MySQL 那样起一个 server),Django 才能用。
db.sqlite3),不需要起服务。Python 标准库已经自带,零安装。这就是它适合教学/小项目的原因。如果 settings.py 里忘了把 'article' 加到 INSTALLED_APPS,会怎样?