首页 > 其他分享 >02. 初识Django框架

02. 初识Django框架

时间:2023-11-12 18:16:25浏览次数:27  
标签:02 虚拟环境 URL py 视图 Django admin 初识

一、Django框架简介

  Django 的 MTV 模式上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些不同,Django 的 MTV 分别是指:

  • M 代表模型(Model):负责业务对象和数据库的关系映射(ORM);
  • T 代表模板(Template):负责如何把页面展示给用户(HTML);
  • V 代表视图(View):负责业务逻辑,并在适当时候调用 Model 和 Template;

  除了以上的三层指外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 Views 处理,Views 再调用响应的 Model 和 Template,MTV 的响应模式如下:

MVT架构

  一般是用户通过浏览器想服务器发送一个请求,这个请求回去访问视图函数(如果不涉及到数据调用,那么这个时候视图函数就返回一个模板也就是一个网页给用户),视图函数去调用模型,模型去数据库中查找数据,然后逐级返回,视图函数把要返回的数据填充到模板中空格中,最后返回网页给用户。

二、创建Django项目

2.1、建立虚拟环境

  使用 Django 之前,需要建立虚拟的工作环境。虚拟环境 是系统的一个位置,你可在其中安装第三方的库,并将这些包与其它的 Python 的包隔离开来。我们新建一个目录,将其命名为【Django】,再在终端中切换到这个目录,并执行如下命令,建立虚拟环境。

python -m venv ll_env

  这里运行了模块 venv,并使用创建了一个名为 ll_env 虚拟环境。

创建虚拟环境

2.2、激活虚拟环境

  如果你使用的 Windows 系统,我们需要在终端中输入下面的命令的来激活虚拟环境:

ll_env\Scripts\activate

如果你使用的是 PowerShell,可能需要将 acticate 的首字母大写;

  如果你使用的是 Mac 或 Linux ,需要下面的命令激活虚拟环境:

source ll_env/bin/activate

  激活虚拟环境后,会在终端最前面显示 (ll_env),其中 ll_env 为虚拟环境名。

激活虚拟环境

  如果要停止虚拟环境,可执行 deactivate 命令:

deactivate

如果关闭运行虚拟环境的终端,虚拟环境也将不在处于活动状态;

2.3、安装Django

  激活虚拟环境后,我们在可以在终端中执行如下命令更新 pip 并安装 Django:

pip install --upgrade pip
pip install django[==版本号]

安装Django

2.4、在Django中创建项目

  在虚拟环境依然处于活动状态的情况下(ll_env 包含在括号内),执行如下命令创建一个项目:

django-admin startproject ll_project .

  命令 startproject 让 Django 新建一个名为 ll_project 的项目。这个命令末尾的句点(.)让新项目使用合适的目录结构。

  Django 新建了一个名为 ll_project 的目录。它还创建了文件 manage.py 文件,这是一个简单的程序,接受命令并将其交给 Django 的相关部分。

  目录 ll_project 包含 4 个文件,其中最重要的是 setting.py、urls.py 和 wsgi.py。文件 settings.py 指定 Django 如何与系统交互以及如何管理项目。在开发项目的过程中,我们将修改其中的一些设置,并添加一些设置。文件 urls.py 告诉 Django,应创建那些网页来响应浏览器请求。文件 wsgi.py 帮助 Django 提供它创建的文件,名称是 web server gateway interfece(Web 服务器网关接口)的首字母缩写。

在Django中创建项目

2.5、创建数据库

  Django 将大部分与项目相关的信息存储在数据库中,因此需要创建一个 Django 使用的数据库。

python manage.py migrate

  我们将修改数据库称为 迁移(migrate)数据库。首次执行命令 migrate 将让 Django 确保数据库与项目的当前状态匹配。在使用 SQLite 的新项目中首次执行这个命令时,Django 将新建一个数据库。在这里,Django 指出它将准备好数据库,用于存储执行管理和身份验证任务需要的信息。

数据库迁移

2.6、查看项目

  我们可以使用命令 runserver 查看当前项目的状态:

python manage.py runserver

  Django 将启动一个服务器(development server),让你能够查看系统中的项目。如果你在浏览器中输入 URL 以请求网页,那么该 Django 服务器将进行响应:生成合适的网页,并将其发送给浏览器。

  Django 首先通过检查确定正确地创建了项目,然后指出使用的 Django 版本以及当前使用的设置文件的名称,最后指出项目的 URL。URL http://127.0.0.1:8000/ 表明项目将在你的计算机的端口 8000 上侦听请求。localhost 表示只处理当前系统发出的请求的服务器,它不允许其他人查看正在开发的网页。

启动服务器

  在浏览器的地址栏中输入 URL http://localhost:8000/(如果不管用,请输入:http://127.0.0.1:8000/),浏览器将返回这样的一个界面,这个界面是由 Django 创建的。

Django启动界面

如果我们想关闭服务器,可以在执行 runserver 命令的窗口按 Ctrl+C;

如果出现错误 "That port is already in use"(指定端口被占用),请执行 python manage.py runserver 8001,让 Django 使用另一个端口。如果这个端口也不可用,请逐渐增大端口号并继续执行上述命令,直到找到可用的端口;

三、创建应用程序

  Django 项目由一系列应用程序组成,它们协同工作让项目成为一个整体。前面打开的终端窗口还应该运行的 runserver。我们新建一个终端端口,并切换到 manage.py 所在的目录。激活虚拟环境,然后执行命令 startapp:

python manage.py startapp blog

  命令 startapp appname 让 Django 搭建应用程序所需的基础设施。查看项目目录,将看到其中新增了文件夹 blog,其中最重要的文件是 models.py、admin.py 和 views.py 文件。

创建应用程序

3.1、定义模型

  models.py 文件定义要在应用程序中管理的数据。模型告诉 Django 如何处理应用程序中存储的数据。模型就是一个类,包含属性和方法。

from django.db import models

# Create your models here.

class Topic(models.Model):
    """用户学习主题"""

    # 由字符组成的数据,即文本
    # 在定义CharField属性时,必须告诉Django该在数据库预留多少空间
    text = models.CharField(max_length=200)

    # 记录日期和时间的数据
    # auto_now_add=True,每当用户创建新主题,Django都会将这个属性自动属性设置为当前的日期和时间
    date_added = models.DateTimeField(auto_now_add=True)

    # 每当需要生成表示模型实例的输出时,Django都将调用这个方法
    def __str__(self):
        # 返回模型的字符串表示
        return self.text

3.2、激活模型

  使用这些模型,必须让 Django 将前述应用程序包含到项目中。为此,打开 settings.py (它位于目录 ll_project 中)文件,其中有个片段告诉 Django,,那些应用程序被安装到了项目中。

应用程序

  修改 INSRALLED_APPS 列表,将我们创建的应用程序添加到这个列表中:

INSTALLED_APPS = [
    # 我的应用程序
    'blog',

    # Django默认加载的应用程序
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

务必将你自己创建的应用程序放在默认应用程序前面,这样能够覆盖默认应用程序的行为。

  接下来,需要让 Django 修改数据库,使其能够存储与模型相关的信息。为此,需要在终端中执行如下命令:

python manage.py makemigrations blog

  命令 makemigrations 让 Django 确定该如何修改数据库,使其能够存储与前面定义的新模型相关联的数据。

激活模型

  每次修改或添加模型后,都需要执行如下命令,再次迁移数据库。

python manage.py migrate

再次迁移数据库

每次添加或修改模型,都需要修改 models.py 文件,执行命令 python manage.py makemigrations appname 激活模型,在执行命令 python manage.py migrate 迁移数据库;

3.3、Django管理网站

  Django 提供的 管理网站(admin site)让你能够轻松地处理模型。Django 管理网站仅供网站的管理员使用,普通用户不能使用。

3.3.1、创建超级用户

  Django 允许创建具备所有权限的用于,即 超级用户(superuser)。权限 决定了用户可执行的操作。最严格的权限设置只允许用户阅读网站的公开信息。注册用户通常可以阅读自己的私有数据,还可以查看一些只有会员才能查看的信息。

  要在 Django 中创建超级用户,我们可以在终端中执行如下命令:

python manage.py createsuperuser

创建超级用户

  在执行命令 createsuperuser 时,Django 会提示输入超级用户的用户名。这里输入的是 ll_admin,但其实可以输入任意用户名,也可以不输入用户名,用默认用户名。接下来的电子邮箱地址可以输入也可以不输入。然后需要输入两次密码。

  我们在浏览器的地址栏中输入网址 http://localhost:8000/admin 回车,浏览器会返回一个登录页面,我们需要用户名和密码就可以访问管理网站。

登录管理网站

管理网站

如果无法加载网站,建议关闭服务器,并重新启动;

3.3.2、向管理网站注册模型

  Django 自动在管理网站上添加了一些模型,如 Groups 和 Users。如果要添加我们创建的模型,则必须手动注册。

  在我们创建应用程序 blog 时,Django 在 modles.py 所在的目录中创建了一个名称 admin.py 文件。在这个文件中,我们可以注册自己的模型。

from django.contrib import admin

from .models import Topic

# Register your models here.
admin.site.register(Topic)

  首先导入要注册的模型 Topic。models 前面的句点让 Django 在 admin.py 所在的目录中查找 models.py。admin.site.register() 让 Django 通过管理网站管理该模型。

  现在我们刷新管理网站,可以看到管理网站上新增了 Topic 这个模型。管理网站不仅让你能够添加和修改用户和用户组,还可以管理与刚才定义的模型相关的数据。

包含模型Topic的管理网站

3.3.3、添加主题

  在管理网站注册模型后,我们可以添加主题。单击 Add 按钮,会出现一个用于添加新主题的表单,输入主题内容后并单击 Save 按钮。

添加主题

保存主题

四、创建网页

  使用 Django 创建网页的过程分为三个阶段:定义 URL编写视图 以及 编写模板URL 模式 描述了 URL 的构成,让 Django 直到如何将浏览器请求与网站的 URL 匹配,以确定返回哪个网站。每个 URL 都被映射到特定的 视图。视图函数获取并处理网页所需的数据。视图函数通常使用 模板 来渲染网页,而模板定义网页的总体结构。

4.1、映射URL

  用户通过在浏览器中输入 URL 和单击链接来请求网页,因此需要确定项目需要哪些 URL。主页的 URL 最重要,它是用户用来访问项目的基础 URL。

  打开项目的主文件夹 ll_project 中的文件 urls.py,它的内容如下:

初始URL

  开头两行导入模块 admin 和一个函数,以便创建 URL 路径。在这个为整个项目定义 URL 的 urls.py 文件中,变量 urlpatterns 包含项目中应用程序的 URL。这里使用模块 admin.site.urls,它定义了可在管理网站中请求的所有 URL。

  因为需要包含 blog 中的 URL,所以添加如下代码:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls'))
]

  这里导入了函数 include(),还添加了一行代码来包含 blog.urls 模块。默认的 urls.py 在文件夹 ll_project 中,现在需要在文件夹 blog 中再创建一个 urls.py 文件,并在该文件中添加如下内容:

"""定义 blog 的 URL 模式"""

from django.urls import path

from . import views

app_name = 'blog'
urlpatterns = [
    # 主页
    path('', views.index, name='index'),
]

  导入函数 path(),因为需要使用它将 URL 映射到视图。然后导入 views 模块,其中的句点让 Python 从当前 urls.py 模块所在的文件夹中导入 views。变量 app_name 让 Django 能够将这个 urls.py 文件与项目内其它应用程序的同名文件区别开来。在这个模块中,变量 urlpatterns 是一个列表,包含可在应用程序 blog 中请求的网页。

  实际上 URL 模式是对 path() 函数的调用,这个函数接受三个实参。第一个是一个字符串,帮助 Django 正确的 路由(route)请求。收到请求的 URL 后,Django 力图将请求路由给一个 视图,并为此搜索所有的 URL 模式,以找到与当前请求匹配的。Django 忽略项目的基础 URL(http://localhost:8000),因此空字符串与基础的 URL 匹配。其它 URL 都与这个模式不匹配。如果请求的 URL 与任何既有的 URL 模式都不匹配,Django 将返回一个错误页面。

  path() 的第二个实参指定要调用 views.py 中的哪个函数。当请求的 URL 与前述表达式匹配时,Django 将调用 views.py 中的 index() 函数(暂时还未写)。

  path() 的第三个实参将这个 URL 模式的名称指定为 index,让我们能在其它项目文件中轻松地引用它。每当需要提供这个主页地链接时,都将使用这个名称,而不编写 URL。

4.2、编写视图

  视图函数接接受请求地信息,准备好生成网页所需要地数据,再将这些数据发给浏览器。这通常时使用定义网页外观的模板实现的。

  blog 中的文件 views.py 是执行命令 python manage.py startapp 时自动生成的,其当前内容如下:

初始views

  当前,这个文件中只导入 render() 函数, 该函数根据视图提供的数据渲染响应。我们在这个文件中添加为主页编写视图的代码:

from django.shortcuts import render

# Create your views here.
def index(request):
    """博客主页的"""
    return render(request, 'index.html')

  当 URL 请求与刚才定义的模式匹配时,Django 将在 views.py 中查找 index() 函数,再将对象 request 传递给这个视图函数。这里不需要处理任何数据,因此这个函数只包含调用 render() 的代码。这里向 render() 函数提供了两个实参:对象 request 和一个可用于创建网页的模板。

4.3、编写模板

  模板定义网页的外观。每当网页被请求时,Django 都将填入相关的数据。模板让你能够访问视图提供的任何数据。

  在文件夹 blog 中新建一个文件夹,并将其命名为 templates。在文件夹 templates 中用来存储有关模板的 HTML 文件。这里新建一个 index.html 文件(它的文件路径为:blog/templates/index.html),它的内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>Blog</h1>
</body>
</html>

  现在,如果请求这个项目的基础 URL http://localhost:8000/,将看到刚才创建的页面,而不是默认的 Django 网页。Django 接受请求的 URL,发现该 URL 与模式 '' 匹配,因此调用 views.index() 函数。这将使用 index.html 包含的模板渲染网页。

index界面

标签:02,虚拟环境,URL,py,视图,Django,admin,初识
From: https://www.cnblogs.com/kurome/p/17827484.html

相关文章

  • 2023-2024-1 20231320 《计算机基础与程序设计》第七周学习总结
    2023-2024-120231320《计算机基础与程序设计》第七周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第七周作业)这个作业的目标<自学《计算机基础与......
  • [省选联考 2021 A/B 卷] 滚榜 - 总结
    [省选联考2021A/B卷]滚榜首先明确要拆开\(\sumb_i\)。因为\(b_i\)不降,所以当一个人做了\(x\)道,后边的人都至少做了\(x\)道。然后我们考虑提前算贡献,对于一个排名\(p_i\)(倒序且\(p_0\)为\(a_i\)最大的位置),贡献是这样的:\(\sumb_i=\sum\max(0,\a_{p_{i-1}}-a_......
  • # 2023-2024-1 20231322 《计算机基础与程序设计》第七周学习总结
    |2022-2023-1-计算机基础与程序设计)||--|--||2022-2023-1计算机基础与程序设计第七周作业)||这个作业的目标|总结本周学习成果及疑问||作业正文|(https://www.cnblogs.com/cjl03/p/17827451.html)|教材学习内容总结数据结构:栈,队列,列表及其性质(线性);图,二叉数及其搜索;子程序教......
  • # (2023-2024-1) (20232410) 《网络》第1周学习总结
    教材学习内容总结网络空间安全的定义,现状,法律,标准。教材学习中的问题和解决过程问题:zuc算法有何创新性问题解决方案:运用ai提问回答感悟:网络空间安全是一门综合性学科,在信息化时代中有着重要的战略意义。参考资料《网络空间安全导论》网络空间安全导论书单......
  • 2023-2024-1 20231303 《计算机基础与程序设计》赵泊瑄第七周学习总结
    2023-2024-120231303《计算机基础与程序设计》赵泊瑄第七周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接2023-2024-1计算机基础与程序设计第七周作业)这个作业的目标总结第七周学习收获作业正文......
  • 学期 2023-2024-1 学号 20232329 《#学期 2023-2024-1 学号 20232329 《网络》第一周
    教材学习内容总结第一章、网络空间安全概述1.1 信息时代与信息安全1.1.1 信息技术与产业空前繁荣1.1.2 信息安全形势严峻1.1.3 我国重视信息安全1.2网络空间安全学科浅谈1.2.1 网络空间与网络空间安全的概念1.2.2 网络空间安全学科的内涵1.2.3 网络空间安全......
  • leetcode hot100-02 字母异位词分组
    题目:字母异位词分组难度:中等地址:https://leetcode.cn/classic/problems/group-anagrams/description/描述:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。过程:1、首先啥叫......
  • 2023-2024-1 学号20231315第七周学习总结
    学期:2023-2024-1学号:20231315《计算机基础与程序设计》第七周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1《计算机基础与程序设计》这个作业的目标学习计算机科学概论第8章和《C语言程序设计》第6......
  • 2023.11.12日报
    今天主要在做大数据实验三,有个问题记录一下代码如下packageTest3;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.*;importorg.apache.hadoop.hbase.util.Bytes;importjava.io.IOException;p......
  • 20211314王艺达 学习笔记9
    第六章信号和信号处理摘要本章讲述了信号和信号处理;介绍了信号和中断的统一处理,有助于从正确的角度看待信号;将信号视为进程中断,将进程从正常执行转移到信号处理;解释了信号的来源,包括来自硬件、异常和其他进程的信号;然后举例说明了信号在Unix/Linux中的常见用法;详细解释了Unix/L......