编写你的第一个 Django 应用(官网demo)

编写你的第一个 Django 应用(官网demo)

安装 Django

确保 Python 已安装(推荐 3.8+版本),通过以下命令安装 Django:

pip install django 

创建项目

使用 django-admin 创建新项目(例如 djangotutorial):

django-admin startproject mysite 

目录结构如下:

mysite/ manage.py mysite/ __init__.py settings.py urls.py asgi.py wsgi.py 

验证:

python manage.py runserver

启动开发服务器

进入项目目录并运行:

python manage.py runserver 

访问 http://127.0.0.1:8000/ 确认服务正常。

创建应用

在项目中创建应用(例如 polls):

python manage.py startapp polls 

目录新增 polls/,包含 views.pymodels.py 等文件。

编写视图

编辑 polls/views.py,添加简单视图:

from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.") 

配置 URL

polls 目录下创建 urls.py,定义路由:

from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ] 

在项目 mysite/urls.py 中引入应用路由:

from django.contrib import admin from django.urls import include, path urlpatterns = [ path('polls/', include('polls.urls')), path('admin/', admin.site.urls), ] 

测试运行

重启开发服务器,访问 http://127.0.0.1:8000/polls/,页面应显示 Hello, world.

数据库配置

编辑 mysite/settings.py,配置 DATABASES(默认使用 SQLite)。执行迁移:

python manage.py migrate 

创建模型

polls/models.py 中定义模型(例如 QuestionChoice):

from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) 

激活模型

settings.pyINSTALLED_APPS 中添加 'polls.apps.PollsConfig'。生成迁移文件并应用:

python manage.py makemigrations polls python manage.py migrate 

修改model

测试:

新加入的 import datetime 和 from django.utils import timezone 分别导入了 Python 的标准 datetime 模块和 Django 中和时区相关的 django.utils.timezone 工具模块。

保存这些更改后,请启动一个新的 Python 交互式 Shell。(如果三个大于号提示符 (>>>) 表明你仍在 Shell 中,需要先使用 exit() 退出)。再次运行 python manage.py shell 以重新加载模型。

管理界面

创建超级用户:

python manage.py createsuperuser 

访问 http://127.0.0.1:8000/admin/ 登录,在 admin.py 中注册模型以管理数据:

向管理页面中加入投票应用

但是我们的投票应用在哪呢?它没在索引页面里显示。

只需要再做一件事:我们得告诉管理,问题 Question 对象需要一个后台接口。打开 polls/admin.py 文件,把它编辑成下面这样:

from django.contrib import admin from .models import Question admin.site.register(Question)

体验便捷的管理功能

现在我们向管理页面注册了问题 Question 类。Django 知道它应该被显示在索引页里:

写一个有用的视图:

修改相关内容,我们在 index() 函数里插入了一些新内容,让它能展示数据库里以发布日期排序的最近 5 个投票问题,以空格分割:

首先,在你的 polls 目录里创建一个 templates 目录。Django 将会在这个目录里查找模板文件。

你项目的 TEMPLATES 配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端,并将 APP_DIRS 设置成了 True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 "templates" 子目录。这就是为什么尽管我们没有像在第二部分中那样修改 DIRS 设置,Django 也能正确找到 polls 的模板位置的原因。

在你刚刚创建的 templates 目录里,再创建一个目录 polls,然后在其中新建一个文件 index.html 。换句话说,你的模板文件的路径应该是 polls/templates/polls/index.html 。因为``app_directories`` 模板加载器是通过上述描述的方法运行的,所以 Django 可以引用到 polls/index.html 这一模板了。

编写一个简单的表单

让我们更新一下在上一个教程中编写的投票详细页面的模板 ("polls/detail.html") ,让它包含一个 HTML <form> 元素:

继续修改:

让我们将我们的投票应用转换成使用通用视图系统,这样我们可以删除许多我们的代码。我们仅仅需要做以下几步来完成转换,我们将:

  1. 转换 URLconf。
  2. 删除一些旧的、不再需要的视图。
  3. 基于 Django 的通用视图引入新的视图

开始写我们的第一个自动化测试:

首先得有个 Bug

幸运的是,我们的 polls 应用现在就有一个小 bug 需要被修复:我们的要求是如果 Question 是在一天之内发布的, Question.was_published_recently() 方法将会返回 True ,然而现在这个方法在 Question 的 pub_date 字段比当前时间还晚时也会返回 True(这是个 Bug)。

用 shell 命令确认一下这个方法的日期bug

创建一个测试来暴露这个 bug

我们刚刚在 shell 里做的测试也就是自动化测试应该做的工作。所以我们来把它改写成自动化的吧。

按照惯例,Django 应用的测试应该写在应用的 tests.py 文件里。测试系统会自动的在所有文件里寻找并执行以 test 开头的测试函数。

将下面的代码写入 polls 应用里的 tests.py 文件内:

结果显示:

更全面的测试

我们已经搞定一小部分了,现在可以考虑全面的测试 was_published_recently() 这个方法以确定它的安全性,然后就可以把这个方法稳定下来了。事实上,在修复一个 bug 时不小心引入另一个 bug 会是非常令人尴尬的。

我们在上次写的类里再增加两个测试,来更全面的测试这个方法:

测试视图

我们的投票应用对所有问题都一视同仁:它将会发布所有的问题,也包括那些 pub_date 字段值是未来的问题。我们应该改善这一点。如果 pub_date 设置为未来某天,这应该被解释为这个问题将在所填写的时间点才被发布,而在之前是不可见的。

改善视图代码

现在的投票列表会显示将来的投票( pub_date 值是未来的某天)。我们来修复这个问题。

测试新视图

现在你可以通过启动 runserver 来验证其行为是否符合预期:在浏览器中加载网站,创建一些过去和未来日期的 Question 条目,然后确认只有已发布的条目才会显示在列表中。你肯定不希望 每次做出可能影响此功能的修改时 都手动重复这一流程——因此让我们基于之前的 shell 会话内容来创建一个测试。

自定义 应用 的界面和风格

首先,在你的 polls 目录下创建一个名为 static 的目录。Django 将在该目录下查找静态文件,这种方式和 Diango 在 polls/templates/ 目录下查找 template 的方式类似。

Django 的 STATICFILES_FINDERS 设置包含了一系列的查找器,它们知道去哪里找到 static 文件。AppDirectoriesFinder 是默认查找器中的一个,它会在每个 INSTALLED_APPS 中指定的应用的子文件中寻找名称为 static 的特定文件夹,就像我们在 polls 中刚创建的那个一样。管理后台采用相同的目录结构管理它的静态文件。

在你刚创建的 static 文件夹中创建一个名为 polls 的文件夹,再在 polls 文件夹中创建一个名为 style.css 的文件。换句话说,你的样式表路径应是 polls/static/polls/style.css。因为 AppDirectoriesFinder 的存在,你可以在 Django 中以 polls/style.css 的形式引用此文件,类似你引用模板路径的方式。

添加一个背景图

接下来,我们将为图像创建一个子目录。 在 polls/static/polls/ 目录中创建 images 子目录。 在此目录中,添加您想用作背景的任何图像文件。 出于本教程的目的,我们使用了一个名为“background.png”的文件,它的完整路径为“polls/static/polls/images/background.png”。

自定义后台表单

通过 admin.site.register(Question) 注册 Question 模型,Django 能够构建一个默认的表单用于展示。通常来说,你期望能自定义表单的外观和工作方式。你可以在注册模型时将这些设置告诉 Django。

添加关联的对象

好了,现在我们有了投票的后台页。不过,一个 Question 有多个 Choice,但后台页却没有显示多个选项。

Read more

[特殊字符]颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发论文检索MCP Server!

[特殊字符]颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发论文检索MCP Server!

🔥🔥🔥本篇笔记所对应的视频:🚀颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发MCP服务_哔哩哔哩_bilibili Open WebUI 的 MCPo 项目:将 MCP 工具无缝集成到 OpenAPI 的创新解决方案 随着人工智能工具和模型的快速发展,如何高效、安全地将这些工具集成到标准化的 API 接口中成为了开发者面临的重要挑战。Open WebUI 的 MCPo 项目(Model Context Protocol-to-OpenAPI Proxy Server)正是为了解决这一问题而设计的。本文将带您深入了解 MCPo 的功能、优势及其对开发者生态的影响。 什么是 MCPo? MCPo 是一个简单、可靠的代理服务器,能够将任何基于 MCP 协议的工具转换为兼容

By Ne0inhk
Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气示例

Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气示例

文章目录 * MCP 官网 * MCP 官方文档中文版 * 官方 MCP 服务示例 * Github * MCP 市场 * 简介 * 架构 * 高德地图 MCP 客户端示例 * python-sdk 客户端 * java-sdk 客户端 MCP 官网 * https://modelcontextprotocol.io/introduction MCP 官方文档中文版 * https://app.apifox.com/project/5991953 官方 MCP 服务示例 * https://github.com/modelcontextprotocol/servers Github * python-sdk:https://github.com/modelcontextprotocol/python-sdk * java-sdk:

By Ne0inhk