Django 入门教程

1. Django简介

基本介绍

Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。

MVC 与 MVT 模型

MVC 模型

MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC 以一种插件式的、松耦合的方式连接在一起。

  • 模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
  • 视图(V)- 图形界面,负责与用户的交互(页面)。
  • 控制器(C)- 负责转发请求,对请求进行处理。

MTV 模型

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

  • M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
  • T 表示模板 (Template):负责如何把页面(html)展示给用户。
  • V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。
    除了以上三层之外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 View 处理,View 再调用相应的 Model 和 Template,MTV 的响应模式如下所示:
    在这里插入图片描述
    解析
    用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数:
    a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。
    b.如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回。

2. 创建项目

创建第一个项目

django-admin startproject My_Project

创建完成后我们可以查看下项目的目录结构:

$ cd My_Project/ #项目的容器。
$ tree
.
|-- My_Project
|   |-- __init__.py 
|   |-- asgi.py #一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
|   |-- settings.py #该 Django 项目的设置/配置。
|   |-- urls.py #一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
|   `-- wsgi.py #一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
`-- manage.py #一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。

WSGI (Web Server Gateway Interface) 是一个 Python 规范,它定义了 Web 服务器和 Python Web 应用程序之间通信的方式。
ASGI (Asynchronous Server Gateway Interface) 是一个新的 Python 规范,它扩展了 WSGI 规范,支持异步操作。
 
WSGI 的主要作用是:

  • 定义 Web 服务器和 Python Web 应用程序之间通信的标准: WSGI 规范定义了服务器环境变量、应用程序对象和 WSGI 协议,这使得不同的 Web 服务器和 Python Web 应用程序可以相互兼容。
  • 简化 Web 应用程序的开发: 通过使用 WSGI 规范,Web 应用程序开发人员可以专注于编写应用程序逻辑,而无需担心服务器端代码。
  • 提高 Web 应用程序的性能: WSGI 规范支持多线程和多进程,这可以提高 Web 应用程序的性能。

 
ASGI 的主要作用是:

  • 支持异步操作: ASGI 规范支持异步操作,例如数据库查询和网络请求。这可以提高 Web 应用程序的性能,因为异步操作可以并发执行。
  • 提高 Web 应用程序的扩展性: ASGI 规范支持多进程和多线程,这可以提高 Web 应用程序的扩展性。

创建第一个app

1. 使用startapp命令

python manage.py startapp my_app

2. 在 settings.py 中注册应用

在你的 Django 项目的 settings.py 文件中,将 my_app 添加到 INSTALLED_APPS 列表中:

INSTALLED_APPS = [
    # ... 其他应用
    'my_app',
]

3. 运行迁移

在创建应用后,需要运行数据库迁移以创建数据库表:

python manage.py makemigrations
python manage.py migrate
my_app/
├── __init__.py
├── admin.py #用于注册模型的管理界面
├── apps.py #用于配置应用的元数据
├── migrations/ #用于存储数据库迁移文件
│   └── __init__.py
├── models.py #models.py 文件是定义模型的地方。每个模型都对应一个数据库表。
├── tests.py #编写测试用例
└── views.py #这个文件用于编写视图函数。视图函数处理用户请求并返回响应。

启动服务器

python3 manage.py runserver 0.0.0.0:8000

在浏览器输入你服务器的 ip(这里我们输入本机 IP 地址: 127.0.0.1:8000) 及端口号,如果正常启动,输出结果如下:
在这里插入图片描述

视图和URL配置

在view.py文件中写响应

#My_Project/myapp/views.py:
from django.http import HttpResponse
 
def hello(request):
    return HttpResponse("Hello world ! ")

接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

#My_Project/myapp/urls.py:
from django.urls import path
 
from . import views
 
urlpatterns = [
    path("", views.hello, name="hello"),
]

完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:
在这里插入图片描述

Path()/re_path()函数区别

1. 简介

pathre_path 都是 Django 中的 URL 路由函数,用于将 URL 模式与视图函数进行关联。

  • path 函数用于匹配精确的 URL 路径。
  • re_path 函数用于匹配正则表达式。

2. 语法

from django.urls import path, re_path

urlpatterns = [
    path('articles/<int:year>/', views.article_list),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.article_list),
]

3. 区别

  • 匹配方式: path 函数用于匹配精确的 URL 路径,而 re_path 函数用于匹配正则表达式。
  • 性能: path 函数的性能比 re_path 函数更高,因为 path 函数不需要编译正则表达式。
  • 灵活性: re_path 函数比 path 函数更灵活,因为它可以匹配更复杂的 URL 模式。

4. 举例

  • 精确匹配: 以下代码将匹配 URL 路径 /articles/2023/
path('articles/<int:year>/', views.article_list)
  • 正则表达式匹配: 以下代码将匹配 URL 路径 /articles/2023//articles/2024/
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.article_list)

3. Django 模板

在 my_app 目录底下创建 templates 目录并建立 runoob.html文件,整个目录结构如下

My_Project/
├── manage.py
├── my_app/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations/
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py
│   └── templates/
│       └── runoo.bhtml
├── db.sqlite3
└── My_Project/
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

runoob.html 文件代码如下:

<h1>{{ hello }}</h1>

接下来我们需要向Django说明模板文件的路径,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为 [os.path.join(BASE_DIR, ‘templates’)],如下所示:

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],       # 修改位置
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...

我们现在修改 views.py,增加一个新的对象,用于向模板提交数据:

from django.shortcuts import render
 
def runoob(request):
    context          = {}
    context['hello'] = 'Hello World!'
    return render(request, 'runoob.html', context)

urls.py文件修改为:

from django.urls import path
 
from . import views
 
urlpatterns = [
    path('runoob/', views.runoob),
]

再次访问 http://127.0.0.1:8000/runoob,可以看到页面:
在这里插入图片描述

4. Django模型

Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django ORM

Django 模型使用自带的 ORM。
对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。
ORM 在业务逻辑层数据库层之间充当了桥梁的作用。
ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
在这里插入图片描述

ORM 解析过程:

  • ORM 会将 Python 代码转成为 SQL 语句。
  • SQL 语句通过 pymysql 传送到数据库服务端。
  • 在数据库中执行 SQL 语句并将结果返回。

ORM对应关系表
在这里插入图片描述

数据库配置

创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法,例如我们创建一个名为 runoob 数据库,编码指定为 utf8:

create database runoob default charset=utf8; # 防止编码问题,指定为 utf8

我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

DATABASES = { 
    'default': 
    { 
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'runoob', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }  
}

上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来。

接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:

# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置 
import pymysql
pymysql.install_as_MySQLdb()

定义模型

修改my_app/models.py:

# models.py
from django.db import models
 
class Test(models.Model):
    name = models.CharField(max_length=20)

以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。
在命令行中运行:

$ python3 manage.py migrate   # 创建表结构

$ python3 manage.py makemigrations my_app  # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate my_app   # 创建表结构

注意:尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。

数据库操作

接下来我们在 My_Project 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

from django.urls import path
 
from . import views,testdb
 
urlpatterns = [
    path('runoob/', views.runoob),
    path('testdb/', testdb.testdb),
]

添加数据

添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from my_app.models import Test
 
# 数据库操作
def testdb(request):
    test1 = Test(name='runoob')
    test1.save()
    return HttpResponse("<p>数据添加成功!</p>")

访问 http://127.0.0.1:8000/testdb 就可以看到数据添加成功的提示。
在这里插入图片描述

获取数据

# testdb.py
# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    # 初始化
    response = ""
    response1 = ""
    
    
    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    listTest = Test.objects.all()
        
    # filter相当于SQL中的WHERE,可设置条件过滤结果
    response2 = Test.objects.filter(id=1) 
    
    # 获取单个对象
    response3 = Test.objects.get(id=1) 
    
    # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    Test.objects.order_by('name')[0:2]
    
    #数据排序
    Test.objects.order_by("id")
    
    # 上面的方法可以连锁使用
    Test.objects.filter(name="runoob").order_by("id")
    
    # 输出所有数据
    for var in listTest:
        response1 += var.name + " "
    response = response1
    return HttpResponse("<p>" + response + "</p>")

更新数据

修改数据可以使用 save() 或 update():

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    test1 = Test.objects.get(id=1)
    test1.name = 'Google'
    test1.save()
    
    # 另外一种方式
    #Test.objects.filter(id=1).update(name='Google')
    
    # 修改所有的列
    # Test.objects.all().update(name='Google')
    
    return HttpResponse("<p>修改成功</p>")

删除数据

删除数据库中的对象只需调用该对象的delete()方法即可:

# -*- coding: utf-8 -*-
 
from django.http import HttpResponse
 
from TestModel.models import Test
 
# 数据库操作
def testdb(request):
    # 删除id=1的数据
    test1 = Test.objects.get(id=1)
    test1.delete()
    
    # 另外一种方式
    # Test.objects.filter(id=1).delete()
    
    # 删除所有数据
    # Test.objects.all().delete()
    
    return HttpResponse("<p>删除成功</p>")

5. Django视图

一个视图函数,简称视图,是一个简单的 Python 函数,它接受 Web 请求并且返回 Web 响应。
视图层中有两个重要的对象:请求对象(request)与响应对象(HttpResponse)。

请求对象: HttpRequest 对象(简称 request 对象)

1. Get

取值格式:对象.方法。

get():返回字符串,如果该键对应有多个值,取出该键的最后一个值。

def runoob(request):
    name = request.GET.get("name")
    return HttpResponse('姓名:{}'.format(name)) 

2. Post

def runoob(request):
    name = request.POST.get("name")
    return HttpResponse('姓名:{}'.format(name))

3. method

获取当前请求的方式,数据类型是字符串,且结果为大写。

def runoob(request):
    name = request.method
    print(name)
    return HttpResponse("菜鸟教程")
返回结果
POST
```
##  响应对象:HttpResponse 对象
响应对象主要有三种形式:HttpResponse()、render()、redirect()。

HttpResponse(): 返回文本,参数为字符串,字符串中写文本内容。如果参数为字符串里含有 html 标签,也可以渲染。
```python
def runoob(request):
    # return HttpResponse("菜鸟教程")
    return HttpResponse("<a href='https://www.runoob.com/'>菜鸟教程</a>")
```
render(): 返回文本,第一个参数为 request,第二个参数为字符串(页面名称),第三个参数为字典(可选参数,向页面传递的参数:键为页面参数名,值为views参数名)。
````python
def runoob(request):
    name ="菜鸟教程"
    return render(request,"runoob.html",{"name":name})
```
redirect():重定向,跳转新页面。参数为字符串,字符串中填写页面路径。一般用于 form 表单提交后,跳转到新页面。
```python
def runoob(request):
    return redirect("/index/")
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656444.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python数据可视化:自定义闭合区域填充颜色matplotlib.pyplot.fill()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python数据可视化&#xff1a; 自定义闭合区域填充颜色 matplotlib.pyplot.fill() [太阳]选择题 以下关于matplotlib.pyplot.fill()函数说法正确的是&#xff1f; import matplotlib.pyplo…

vue 微信公众号定时发送模版消息

目录 第一步&#xff1a;公众号设置 网页授权第二步&#xff1a;引导用户去授权页面并获取code第三步&#xff1a;通过code换取网页授权access_token&openid第四步&#xff1a;后端处理绑定用户和发送消息 相关文档链接&#xff1a; 1、微信开发文档 2、订阅号/服务号/企业…

Hadoop伪分布式搭建

1 配置SSH免密登录 1.生成密钥 # ssh-keygen -t rsa 注意&#xff1a;需要经过4次回车 查看密钥及公钥 # cd /root/.ssh 拷贝公钥 # cp id_rsa.pub authorized_keys 2 测试本地免密登录 2 下载Hadoop安装包 使用wget命令从华为云上下载Hadoop安装文件 # wget -P /opt https://m…

Py列表(list)

目录 正向索引&#xff1a; 反向索引&#xff1a; 嵌套列表&#xff1a; 修改列表中的值 列表常用的方法 实例 练习&#xff1a; 正向索引&#xff1a; 从0开始&#xff0c;依次递增。第一个元素的索引为0&#xff0c;第二个元素的索引为1&#xff0c;依此类推。 列表的下标…

Kubernetes集群调度

一.List-Watch 1.调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 P…

Let‘s Encrypt 免费证书申请

填写邮箱&#xff0c;申请的域名 单域名&#xff1a;www.example.com 泛域名&#xff1a; *.example.com yum -y install certbot sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns --email xxexample…

Golang | Leetcode Golang题解之第102题二叉树的层序遍历

题目&#xff1a; 题解&#xff1a; func levelOrder(root *TreeNode) [][]int {ret : [][]int{}if root nil {return ret}q : []*TreeNode{root}for i : 0; len(q) > 0; i {ret append(ret, []int{})p : []*TreeNode{}for j : 0; j < len(q); j {node : q[j]ret[i] …

如何选择序列化协议:关键因素与场景分析

如何选择序列化协议&#xff1a;关键因素与场景分析 序列化协议的选择直接影响着系统的性能、可维护性及跨平台兼容性。以下是针对不同场景下&#xff0c;几种常见序列化协议的选择建议&#xff1a; 1. 公司间系统调用&#xff08;性能要求宽松&#xff09; SOAP (基于XML)&a…

vue深度选择器(:deep​)

处于 scoped 样式中的选择器如果想要做更“深度”的选择&#xff0c;也即&#xff1a;影响到子组件&#xff0c;可以使用 :deep() 这个伪类&#xff1a; <style lang"scss" scoped> .evaluation-situation-details :deep .cl-icon-arrow-right {display: none…

C语言学习笔记--C语言的实型数据

实型常量的表示方法&#xff08;掌握&#xff09; 实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中&#xff0c;实数只采用十进制。它有两种形式&#xff1a;十进制小数形式&#xff0c;指数形式。 1十进制数形式&#xff1a;由数码0~9和小数点组成。 例如&…

VSCODE中F12无法跳转,快捷键设置F12和insert混淆了

异常现象 最近用新电脑&#xff08;华为&#xff09;的时候&#xff0c;发现VSCODE经常按F12无法跳转&#xff0c;在快捷键设置当中&#xff0c;也是设置成功的&#xff1b; 此时重新去快捷键设置&#xff0c;会发现按 F12变为了Insert 解决方法 华为笔记本的Fx按键&#x…

淘宝扭蛋机小程序开发:探索无限惊喜的购物新体验

随着科技的不断进步&#xff0c;人们的生活方式也在发生翻天覆地的变化。在这个数字化、智能化的时代&#xff0c;淘宝扭蛋机小程序应运而生&#xff0c;为消费者带来了一种全新的购物体验。 淘宝扭蛋机小程序是一款集娱乐、互动、购物于一体的创新应用。它巧妙地将扭蛋机的乐…

FL Studio v21.2.3.4004中文破解版百度网盘下载

FL Studio v21.2.3.4004中文破解版是一款完整的软件音乐制作环境或数字音频工作站 (DAW)。代表了超过 18 年的创新发展&#xff0c;它在一个软件包中提供了您创作、编曲、录制、编辑、混音和掌握专业品质音乐所需的一切。FL Studio v21.2.3.4004中文破解版现在是世界上最受欢迎…

微信小程序中使用vantUI步骤

第一步&#xff0c;配置project.config.json 在setting中新增如下&#xff1a; "packNpmManually": true,"packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./"}], 第…

Java客户端SpringDataRedis(RedisTemplate)上手

文章目录 ⛄概述⛄快速入门❄️❄️导入依赖❄️❄️配置文件❄️❄️测试代码 ⛄数据化序列器⛄StringRedisTemplate⛄RedisTemplate的两种序列化实践方案总结 ⛄概述 SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…

Vue3实战笔记(35)—集成炫酷的粒子特效

文章目录 前言一、vue3使用tsparticles二、使用步骤总结 前言 学习一个有趣炫酷的玩意开心一下。 tsparticles&#xff0c;可以方便的实现各种粒子特效。支持的语言框架也是相当的丰富. 官网&#xff1a;https://particles.js.org/ 一、vue3使用tsparticles 先来个vue3使用…

《智能水表计量平台技术架构:数字化管理助力节水环保》

随着科技的不断发展&#xff0c;智能水表计量平台作为一种新型的水资源管理工具&#xff0c;正在逐渐受到关注和应用。本文将深入探讨智能水表计量平台的技术架构设计与实现&#xff0c;以及如何通过数字化管理助力节水环保事业。 ### 1. 系统架构概述 智能水表计量平台的技术…

智能高效的IDE GoLand v2024.1全新发布 - 进一步升级AI辅助工具

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

Java入门基础学习笔记48——ArrayList的应用案例

掌握从容器中找出某些数据并成功删除的技巧&#xff1a; 需求&#xff1a; 现在加入购物车中存储了如下这些商品&#xff1a;Java入门&#xff0c;宁夏枸杞&#xff0c;黑枸杞&#xff0c;人字拖&#xff0c;特级枸杞&#xff0c;枸杞子。现在用户不想买枸杞了&#xff0c;选…

java多线程创建方式

1. 继承Thread类 这种方式是通过创建一个新的类继承自Thread类&#xff0c;并覆盖run()方法来创建线程。然后通过创建这个类的对象并调用其start()方法来启动线程。 public class MyThread extends Thread { public void run() { // 在这里定义线程的执行逻辑 …