十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Django Notes:基于 Django + Postgres 在 Vercel 上构建笔记应用的完整实战指南

Django Notes:基于 Django + Postgres 在 Vercel 上构建笔记应用的完整实战指南 Django Notes基于 Django Postgres 在 Vercel 上构建笔记应用的完整实战指南【免费下载链接】examplesEnjoy our curated collection of examples and solutions. Use these patterns to build your own robust and scalable applications.项目地址: https://gitcode.com/GitHub_Trending/examples1/examples导读Django Notes 是一个用 Django 构建的轻量级笔记应用示例完整展示了服务端渲染SSR、URL 路由、表单处理与 ORM 的典型用法并演示了同一套代码如何在本地使用 SQLite、在 Vercel 上自动切换到 Postgres 的双环境数据库方案。读完本文你将掌握 Django 项目的环境变量驱动配置、读写分离READ_ONLY模式、部署时自动迁移以及一键部署 Vercel 的完整流程。项目概览与目录结构Django Notes 的定位是 Starter 级示例见 README.md核心目标有三点一是演示 Django 的经典开发范式二是展示如何通过环境变量在 SQLite 与 Postgres 之间无缝切换三是作为可直接部署到 Vercel 的 Serverless Python 应用模板。仓库内的实际目录结构如下python/django-notes/ ├── config/ # 项目配置包 │ ├── settings.py # 核心配置数据库、中间件、模板等 │ ├── urls.py # 根路由将请求转发给 notes 应用 │ └── wsgi.py # WSGI 入口供 Vercel 的 Python Runtime 调用 ├── notes/ # 业务应用 │ ├── migrations/ # 数据库迁移含种子数据 │ ├── models.py # Note 模型 │ ├── forms.py # 基于模型的表单 │ ├── views.py # 五个视图函数 │ ├── urls.py # 应用级路由 │ ├── context_processors.py# 将 READ_ONLY 注入模板上下文 │ ├── static/notes/ # 静态资源style.css │ └── templates/notes/ # 四个 HTML 模板 ├── manage.py # Django 命令行入口含 .env.local 加载 ├── pyproject.toml # 项目依赖与 Vercel 构建脚本 └── uv.lock # uv 依赖锁定文件从结构上看这是一个典型的单一业务应用 根配置包的 Django 项目布局config只负责全局配置与 WSGI 入口所有业务逻辑集中在notes应用内非常适合作为中小型 Django 项目的起步模板。核心数据模型与路由设计Note 模型业务实体非常简单notes/models.py中仅定义一个Note模型包含标题与正文两个字段from django.db import models class Note(models.Model): title models.CharField(max_length200) body models.TextField() def __str__(self): return self.title对应的首条迁移 0001_initial.py 除了创建Note表主键为BigAutoField之外还通过RunPython写入三条种子笔记其中一条明确提示This demo is read-only. Deploy your own copy to create, edit, and delete notes.这与部署环境中默认开启的只读模式相互呼应。五个视图与五条路由应用级路由 notes/urls.py 定义了完整的 CRUD 路由from django.urls import path from . import views urlpatterns [ path(, views.note_list, namenote_list), path(notes/new/, views.note_create, namenote_create), path(notes/int:pk/, views.note_detail, namenote_detail), path(notes/int:pk/edit/, views.note_edit, namenote_edit), path(notes/int:pk/delete/, views.note_delete, namenote_delete), ]根路由 config/urls.py 将所有请求统一交给notes.urlsfrom django.urls import path, include urlpatterns [ path(, include(notes.urls)), ]对应地notes/views.py 实现了五个函数视图note_list查询全部笔记并渲染列表页note_detail通过get_object_or_404按主键取单条笔记note_createGET 渲染空表单POST 校验后保存并重定向到详情页note_editGET 回填已有数据POST 更新后重定向note_deletePOST 删除后回到列表页GET 则重定向到详情页防止误删。值得注意的是除列表与详情外的三个写操作视图在函数体第一行都检查了settings.READ_ONLY一旦开启即直接返回HttpResponseForbidden(This demo is read-only.)——这是整个应用只读模式的落地位置具体见后文只读模式一节。基于模型的表单表单层使用了 Django 的ModelForm机制notes/forms.py由Note模型自动派生title与body两个字段并配置了占位符与自动聚焦等 widget 属性from django import forms from .models import Note class NoteForm(forms.ModelForm): class Meta: model Note fields [title, body] widgets { title: forms.TextInput(attrs{ placeholder: Note title, autofocus: True, }), body: forms.Textarea(attrs{ placeholder: Write your note here..., rows: 8, }), }views.py中form NoteForm(request.POST)与form NoteForm(request.POST, instancenote)两种用法分别对应新建与编辑场景体现了ModelForm在增改复用上的便利。环境变量驱动的双数据库配置这是本示例最核心的工程技巧同一份代码通过一个环境变量决定使用 SQLite 还是 Postgres。config/settings.py 中的关键逻辑如下if os.environ.get(DATABASE_URL): url urllib.parse.urlparse(os.environ[DATABASE_URL]) DATABASES { default: { ENGINE: django.db.backends.postgresql, NAME: url.path.lstrip(/), USER: url.username, PASSWORD: url.password, HOST: url.hostname, PORT: url.port, } } else: DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, } }其工作原理可以拆解为三点本地零配置未设置DATABASE_URL时数据库回退为 SQLite 文件db.sqlite3本地开发无需启动任何数据库服务Vercel 自动切换在 Vercel 上添加 Postgres 数据库后平台会自动注入DATABASE_URL环境变量代码随即切换为 PostgreSQL 引擎django.db.backends.postgresql驱动使用 pyproject.toml 中声明的psycopg[binary]3.1连接串解析通过urllib.parse.urlparse把形如postgres://user:passhost:port/dbname的连接串拆解为NAME、USER、PASSWORD、HOST、PORT五个 Django 数据库配置项无需手写拆分逻辑。Vercel 上添加数据库的时机有两个一是在项目导入Import阶段直接挂载二是在项目创建后进入 Storage 选项卡再行绑定README 中明确说明这两种方式都可行。设置 DJANGO_SECRET_KEYDjango 依赖SECRET_KEY进行加密签名如 CSRF 令牌、会话签名等。示例的 settings.py 中提供了带默认值的读取方式SECRET_KEY os.environ.get(DJANGO_SECRET_KEY, django-insecure-change-me-in-production)由于仓库公开默认值django-insecure-change-me-in-production仅用于让项目在本地可直接启动绝不能用于生产环境。README 推荐在 Vercel 的环境变量界面中设置DJANGO_SECRET_KEY也可以用一条命令生成随机密钥并写入 Vercel 的prod环境uv run python -c from django.core.management.utils import get_random_secret_key; print(get_random_secret_key()) | vercel env add -y DJANGO_SECRET_KEY prod这条命令分两步完成先用get_random_secret_key()生成高强度随机密钥再通过管道交给vercel env add -y存入生产环境。在项目导入 Vercel 时README 的部署链接同样要求预先配置DJANGO_SECRET_KEY环境变量可见它是部署的硬性前置条件。如何工作WSGI、模板、staticfiles 与自动迁移WSGI 入口示例通过 WSGI 协议运行在 Vercel 的 Python Serverless Runtime 上。config/wsgi.py 是标准的 WSGI 引导文件先设置DJANGO_SETTINGS_MODULEconfig.settings再调用get_wsgi_application()导出模块级application对象Vercel 依据pyproject.toml与框架探测自动发现该入口。模板与 staticfilessettings.py中启用了django.contrib.staticfiles与django.contrib.contenttypesDjango 6 中内容类型框架为必装依赖并配置了APP_DIRS: True因此 notes/templates/notes/ 下的base.html、list.html、detail.html、form.html四个模板会被自动发现。静态资源方面STATIC_ROOT BASE_DIR / staticfiles定义了收集目录STATIC_URL /static/定义了 URL 前缀样式文件位于 notes/static/notes/style.css。列表模板 list.html 演示了模板标签与上下文的配合{% if not read_only %}控制New Note按钮在只读模式下隐藏{{ note.body|truncatechars:100 }}对正文做 100 字符截断笔记卡片整体包在指向详情页的链接中。部署时自动迁移迁移的自动执行依托于 pyproject.toml 中的 Vercel 自定义构建脚本[tool.vercel.scripts] build if [ -n $DATABASE_URL ]; then python manage.py migrate --noinput; fi每次部署时Vercel 会先执行该构建脚本仅当DATABASE_URL存在即已绑定 Postgres时才运行python manage.py migrate --noinput本地 SQLite 场景则跳过避免无谓的构建失败。README 特别强调了一个重要注意事项由于每次部署都会自动跑迁移应选用支持分支branching的数据库提供商如 Neon这样预览部署Preview Deployment会在隔离的分支上执行迁移而不会直接作用于生产数据库从而避免多人协同时的迁移冲突与生产数据风险。只读模式 READ_ONLY设置READ_ONLYtrue可以禁用全部写操作这一机制在三个层面协同生效配置层settings.pyREAD_ONLY os.environ.get(READ_ONLY) 1解析环境变量为布尔值视图层views.pynote_create、note_edit、note_delete三个视图在入口处判断settings.READ_ONLY为真时直接返回 403HttpResponseForbidden模板层context_processors.py list.html自定义上下文处理器把{read_only: settings.READ_ONLY}注入所有模板前端据此隐藏New Note入口。官方演示站点正是以只读模式运行的种子数据中的提示也印证了这一点而克隆部署自己的副本后即可正常增删改这既保护了共享演示数据又完整保留了功能的可体验性。在本地运行项目使用 uv 作为 Python 包管理工具本地启动只需三条命令uv sync uv run python manage.py migrate uv run python manage.py runserveruv sync依据pyproject.toml与uv.lock同步安装依赖Django 6.0 与 psycopg 3.1要求 Python 3.12uv run python manage.py migrate应用迁移本地默认在 SQLite 上建表并写入种子笔记uv run python manage.py runserver启动开发服务器。启动后访问http://localhost:8000即可看到笔记列表。这里还有一个实用细节入口脚本 manage.py 会在启动时自动加载项目根目录下的.env.local文件若存在——这正是vercel env pull拉取本地环境变量后的产物。也就是说在本地执行过vercel env pull后DATABASE_URL、DJANGO_SECRET_KEY等远程环境变量会被自动注入本地进程让你用与生产完全一致的配置在本地联调 Postgres 场景。其他关键配置速查除数据库与密钥外settings.py 还包含几处值得留意的默认配置配置项取值说明DEBUGos.environ.get(DJANGO_DEBUG) 1显式开启DJANGO_DEBUG1才进入调试模式生产默认关闭ALLOWED_HOSTS[127.0.0.1, localhost, .vercel.app]放行本地回环地址与所有.vercel.app子域MIDDLEWARESecurity / Common / CSRF精简的三件套中间件聚焦安全与 CSRF 防护ROOT_URLCONFconfig.urls根路由指向config包WSGI_APPLICATIONconfig.wsgi.applicationWSGI 应用定位LANGUAGE_CODE/TIME_ZONEen-us/UTC语言与时区默认值STATIC_ROOT/STATIC_URLBASE_DIR / staticfiles//static/静态文件收集目录与 URL 前缀部署到 VercelREADME 提供了一键部署One-Click Deploy入口点击部署按钮后Vercel 会根据仓库地址克隆项目并引导你配置DJANGO_SECRET_KEY环境变量随后即可完成导入。部署的完整链路为导入项目并设置DJANGO_SECRET_KEY可在导入时绑定 Postgres也可之后在 Storage 选项卡添加Vercel 注入DATABASE_URL构建脚本自动执行迁移应用以 WSGI 形式运行于 Python Serverless Functions生产环境建议同时设置READ_ONLYtrue演示场景或保持可写自有实例。总结Django Notes 用最小化的代码量浓缩了一个 Django 应用从开发到上云的全过程以ModelForm简化表单、以环境变量切换双数据库、以READ_ONLY实现安全只读演示、以pyproject.toml钩子完成部署期自动迁移。对希望快速掌握 Django 服务端渲染范式并部署到 Vercel Serverless 平台的开发者而言这个示例是开箱即用的理想起点——克隆后替换密钥、绑定数据库一个生产可用的笔记应用即可上线。【免费下载链接】examplesEnjoy our curated collection of examples and solutions. Use these patterns to build your own robust and scalable applications.项目地址: https://gitcode.com/GitHub_Trending/examples1/examples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表