Django从入门到精通(一)
目录
一、Django环境搭建与命令
1.1、安装
1.2、命令行
创建项目
编写代码
运行
app概念
1.3、Pycharm创建项目
1.4、虚拟环境
创建虚拟环境 - 命令行
介绍
操作
基本问题
Pycharm
项目+虚拟环境
django+虚拟环境【安装django最新版本】
django+虚拟环境【安装指定版本django】
1.5、关于创建app
二、路由
2.1、传统的路由
传参的几种方式
(1)restful风格
(2)问号传参
2.2、正则表达式路由
2.3、路由分发
include分发
手动分发
2.4、name属性
2.5、namespace
2.6、namespace扩展
namespace需要设置app_name
手动分发
2.7、最后的 / 如何解决?
2.8、当前匹配对象
一、Django环境搭建与命令
1.1、安装
pip install django==3.2
C:\Python39- python.exe- Scripts- pip.exe- django-admin.exe- Lib- re.py- random.py- site-pakages- django==3.2...
1.2、命令行
创建项目
cd 指定目录
django-admin startproject 项目名

django_demo01
├── manage.py [项目的管理工具]
└── django_demo01├── __init__.py├── settings.py 【配置文件,只有一部分。程序启动时,先读取django内部配置,再读settings.py】├── urls.py 【主路由,在里面编写 /xxx/xxx/xxx ---> index 】├── asgi.py 【异步】└── wsgi.py 【同步,主】
编写代码
在urls.py中编写
from django.contrib import admin
from django.urls import pathfrom django.shortcuts import HttpResponsedef info(request):print("请求来执行了")return HttpResponse("xxxx")def xxxx(request):print("请求来执行了")return HttpResponse("。。。。。。")urlpatterns = [# path('admin/', admin.site.urls),path('api/index/', info),path('api/show/', xxxx),
]
运行
cd 项目
python manage.py runserver
python manage.py runserver 127.0.0.1:8000
python manage.py runserver 127.0.0.1:9000

访问http://127.0.0.1:8000/api/index/

app概念
cd 项目
python manage.py startapp 名字
django_demo01
├── manage.py [项目的管理工具]
├── web├── __init__.py├── views.py [视图函数]├── models.py [ORM,基于models可以对数据库进行简便的操作]...
└── django_demo01├── __init__.py├── settings.py 【配置文件,只有一部分。程序启动时,先读取django内部配置,再读settings.py】├── urls.py 【主路由,在里面编写 /xxx/xxx/xxx ---> index 】├── asgi.py 【异步】└── wsgi.py 【同步,主】
app的概念其实就是按业务分,比如一个项目中,支付功能一个app、订单功能一个app,有点像Java里微服务的意思。

现在我们把刚才写的两个方法的代码放到web/views.py中:

修改urls.py代码:

启动项目:

1.3、Pycharm创建项目


直接点击启动项目:

1.4、虚拟环境
注意:以后再创建项目时,不要一直用系统解释器,为每个项目:虚拟环境 + 项目文件。
创建虚拟环境 - 命令行
介绍
- venv,Python官方用于创建虚拟环境的工具。
cd xxx/xxx/crm
python3.9 -m venv ddd
python3.7 -m venv xxxx
python3.7 -m venv /xxx/xxx/xxx/xx/ppp
- virtualenv 【推荐】
pip install virtualenv
cd /xxx/xx/
virtualenv ddd --python=python3.9
virtualenv /xxx/xx/ddd --python=python3.7
操作
第一步:pip安装virtualenv
pip install virtualenv
第二步:在D:\study\python\envs创建虚拟环境
virtualenv crm --python=python3.9

注意:crm是我们的虚拟环境名,随便起。
第三步:激活虚拟环境
cd D:\study\python\envs\crm\Scripts
activate

第四步:虚拟环境中安装Django包
pip install django==3.2
第五步:创建django项目
cd D:\study\python\projects
django-admin startproject crm
注意:这里的crm是项目名。

第六步:退出虚拟环境
deactivate

基本问题
问题1:如何删除虚拟环境?
直接删文件夹即可。比如我们上面例子虚拟环境文件夹叫crm,直接删除。
问题2:使用virtualenv创建虚拟环境时,Python3.9的系统环境可以创建Python3.7虚拟环境吗?
不可以,你系统环境Python是什么版本只能创建什么版本的虚拟环境。
Pycharm
项目+虚拟环境

我的习惯一般在venv前面加上点,默认让它隐藏。


django+虚拟环境【安装django最新版本】

注意:这种方式默认pip install django命令安装,安装的是最新版本的django。
django+虚拟环境【安装指定版本django】
第一步:我们先创建普通Python项目

第二步:打开终端,输入安装3.2版本django命令
pip install django==3.2

第三步:在终端输入如下命令
django-admin startproject django_test01 .

第四步:添加django服务




第五步:启动django服务

1.5、关于创建app
第一步:先安装指定版本的django项目

第二步:项目下右键创建apps文件夹
注意:apps文件夹里包括各种模块的文件。
第三步:在apps文件夹下随便创建几个文件代表模块

第四步:分别为模块创建app
在终端中分别输入:
python manage.py startapp api apps/api
python manage.py startapp backend apps/backend
python manage.py startapp web apps/web

第五步:修改这三个模块apps文件里的name属性

这就是一个完整的django多app应用结构了。
二、路由
2.1、传统的路由
urls.py
from django.contrib import admin
from django.urls import path
from apps.web import viewsurlpatterns = [path('home/', views.home),path('news/<int:nid>/edit/', views.news),path('article/', views.article),
]
path()第一个参数是我们需要在浏览器访问的url地址,第二个参数是函数名。
views.py
from django.shortcuts import render, HttpResponsedef home(request):return HttpResponse("成功")def news(request, nid):print(nid)page = request.GET.get("page")return HttpResponse("新闻")def article(request):nid = request.GET.get("nid")print(nid)return HttpResponse("文章")


传参的几种方式
(1)restful风格
urlpatterns = [path('news/<int:nid>/edit/', views.news)
]
def news(request, nid):print(nid) # 接收参数return HttpResponse("新闻")

-
int,整数
-
str,字符串 /
-
slug,字母+数字+下滑线+-
-
uuid,uuid格式
-
path,路径,可以包含 /
注意:字符串你可以输入任何东西,比如aaa=bbb这种,但slug有等号就会报错,因为slug只能包含字母数字下划线。
(2)问号传参
urlpatterns = [path('article/', views.article)
]
def article(request):nid = request.GET.get("nid") # 接收参数print(nid)return HttpResponse("文章")

2.2、正则表达式路由
-
在django1版本用的多。
-
在django2+版本用的少

2.3、路由分发
include分发
假如:200个功能。
include + app(一般),将功能拆分不到不同的app中。
第一步:在三个app模块中分别创建自己的urls.py文件

第二步:对api模块进行操作
views.py
from django.shortcuts import render,HttpResponsedef getApiName(request):return HttpResponse("编程抗氧化——api")
urls.py
urlpatterns = [path('getApiName/', views.getApiName),
]
第三步:对web模块进行操作
views.py
from django.shortcuts import render, HttpResponsedef getWebName(request):return HttpResponse("编程抗氧化——web")
urls.py
urlpatterns = [path('getWebName/', views.getWebName),
]
第四步:在主urls.py中编码,引入其它模块的urls
from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('api/', include("apps.api.urls")),path('web/', include("apps.web.urls")),
]
第五步:测试


当我们路径带有api或者web,自动匹配到主urls.py,然后找对应的include为我们分发到下面子模块的urls.py中。
手动分发
有时候我们可能项目没那么多功能,也就用不着创建多个app模块,假如说我们现在就一个模块,有用户的增删改查、角色的增删改查、菜单的增删改查等等... 那么urls.py就得是这样的:
path('user/add/', views.userAdd),
path('user/delete/', views.userDelete),
path('user/edit/', views.userEdit),
path('user/list/', views.userList),path('role/add/', views.roleAdd),
path('role/delete/', views.roleDelete),
path('role/edit/', views.roleEdit),
path('role/list/', views.roleList),path('menu/add/', views.menuAdd),
path('menu/delete/', views.menuDelete),
path('menu/edit/', views.menuEdit),
path('menu/list/', views.menuList),
看起来很冗杂,而且好多路径都是重复的,那么我们可以使用手动分发的方式去处理这种情况:
path('user/', ([path('add/', views.userAdd),path('delete/', views.userDelete),path('edit/', views.userEdit),path('list/', views.userList),], None, None)),path('role/', ([path('add/', views.roleAdd),path('delete/', views.roleDelete),path('edit/', views.roleEdit),path('list/', views.roleList),], None, None)),path('menu/', ([path('add/', views.menuAdd),path('delete/', views.menuDelete),path('edit/', views.menuEdit),path('list/', views.menuList),], None, None)),
这样看起来是不是就轻松多了。
2.4、name属性
给一个路由起个名字 + 根据名字反向生成URL。
from django.contrib import admin
from django.urls import path
from django_test01 import views# 很多功能,很多URL
urlpatterns = [path('login/', views.login, name="v1"),path('auth/', views.auth, name="v2"),
]
其实就是起个名字。
有了名字后,以后一般有两处会用到:
(1)在视图函数中生成URL
比如我有一个需求:浏览器访问/login,在login方法中再跳转到auth方法,这时我们的做法是:
urls.py
from django.contrib import admin
from django.urls import path
from django_test01 import views# 很多功能,很多URL
urlpatterns = [path('login/', views.login, name="v1"),path('auth/', views.auth, name="v2"),
]
views.py
from django.shortcuts import render, HttpResponse, redirectdef auth(request):return HttpResponse("auth")def login(request):return redirect("/auth/") # 重定向到/auth
当我们访问http://localhost:8000/login 时调用了auth方法。

那么说了这么多,name的作用在哪呢?别急,这就告诉你...
我们可以将上面views.py的代码改为:
from django.shortcuts import render, HttpResponse, redirectdef auth(request):return HttpResponse("auth")def login(request):from django.urls import reverseurl = reverse("v2") # /auth/return redirect(url)
我们可以通过reverse方法来获得name="v2"的url路径,这样写法就灵活多了。
(2)HTML模板,页面上有一个a标签,添加xx
<a href="{% url 'v1' %}">添加</a>
<a href="{% url 'v2' %}">添加</a>
2.5、namespace
辅助name。
主路由:
from django.urls import path, re_path, include# 很多功能,很多URL
urlpatterns = [path('api/', include("apps.api.urls",namespace='x1')),path('web/', include("apps.web.urls",namespace='x2')),
]
api/urls.py
from django.urls import path, re_path
from . import views
# 很多功能,很多URL
urlpatterns = [path('login/', views.login,name="login"),path('auth/', views.auth, name='auth'),
]
web/urls.py
from django.urls import path, re_path
from . import views
# 很多功能,很多URL
urlpatterns = [path('home/', views.home,name='home'),path('order/', views.order,name='order'),path('auth/', views.order, name='auth'),
]
以后再某个URL或者视图中反向生成:
from django.urls import reverse
url = reverse("x1:login") # /api/login/
url = reverse("x1:order") # /web/login/url = reverse("x1:auth") # /api/login/
url = reverse("x2:auth") # /web/login/
2.6、namespace扩展
namespace需要设置app_name
主路由
urlpatterns = [path('api/', include("apps.api.urls", namespace='x1')),
]
api/urls.py
from django.urls import path, re_path
from apps.api import views# 很多功能,很多URL
urlpatterns = [path('login/', views.login, name="login"),path('auth/', views.auth, name='auth'),
]app_name = "api"
手动分发

2.7、最后的 / 如何解决?
当在settings.py中设置 APPEND_SLASH = True
path('login/', views.login),http://127.0.0.1:8000/login/ 成功http://127.0.0.1:8000/login django,重定向301http://127.0.0.1:8000/login/ 成功
当我们访问http://127.0.0.1:8000/login/ 直接访问成功,这不多说!!!
但当我们访问http://127.0.0.1:8000/login 发现django会自动为我们补上最后一个斜杠,这是因为请求第一次没带斜杠django会为我们重定向到带斜杠的路径。
path('login', views.login),http://127.0.0.1:8000/login 成功http://127.0.0.1:8000/login http://127.0.0.1:8000/login/ 失败
APPEND_SLASH = False
path('login/', views.login),http://127.0.0.1:8000/login/ 成功http://127.0.0.1:8000/login 失败
path('login', views.login),http://127.0.0.1:8000/login/ 失败http://127.0.0.1:8000/login 成功
设置了false,django不会自动为你加斜杠,该是什么就是什么。
2.8、当前匹配对象

有什么用呀?
某用户,具有一些权限。 permissions = ["xx","login",'account']
某用户,具有一些权限。 permissions = ["login",'account']

相关文章:
Django从入门到精通(一)
目录 一、Django环境搭建与命令 1.1、安装 1.2、命令行 创建项目 编写代码 运行 app概念 1.3、Pycharm创建项目 1.4、虚拟环境 创建虚拟环境 - 命令行 介绍 操作 基本问题 Pycharm 项目虚拟环境 django虚拟环境【安装django最新版本】 django虚拟环境【安装指…...
数据库分表分库的原则
什么是数据库分库分表 数据库分表(Table Sharding) 数据库分表是将一个大表按照某种规则拆分成多个小表存储在不同的物理表中的技术。通常,拆分规则是基于某个列的值进行拆分,例如根据用户ID或日期范围等进行拆分。每个小表只包…...
Java技术栈 —— Docker容器
Java技术栈 —— Docker容器 一、什么是Docker?二、如何安装Docker?三、如何使用Docker? 一、什么是Docker? docker的本意是码头工人。 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个…...
Mysql大数据量分页优化
前言 之前有看过到mysql大数据量分页情况下性能会很差,但是没有探究过它的原因,今天讲一讲mysql大数据量下偏移量很大,性能很差的问题,并附上解决方式。 原因 将原因前我们先做一个试验,我做试验使用的是mysql5.7.2…...
QT tcp与udp网络通信以及定时器的使用 (7)
QT tcp与udp网络通信以及定时器的使用 文章目录 QT tcp与udp网络通信以及定时器的使用1、QT网络与通信简单介绍2、QT TCP通信1、 服务器的流程2、 客户端的流程3、服务器的编写4、客户端的编写 3、QT UDP通信1、客户端流程2、客户端编写3、UDP广播4、UDP组播 4、定时器的用法1、…...
web架构师编辑器内容-添加自动保存的功能
对于频繁改动的应用,自动保存的功能是一个非常有用的功能,可以避免用户在没有保存的情况下丢失自己保存过的数据。 对于自动保存,一般有两种实现,参考语雀和石墨: 语雀采用的是定时保存的方式,大约在3分半…...
【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?
目录 1.既然redis那么快,为什么不用它做主数据库,只用它做缓存? 2.Redis 一般在什么场合下使用? 3.redis为什么这么快? 4.Redis为什么要引入了多线程? 1.既然redis那么快,为什么不用它做主数据…...
SpringBoot之JWT登录
JWT JSON Web Token(JSON Web令牌) 是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任,因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…...
【备战蓝桥杯】——循环结构
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-bFHV3Dz5xMe6d3NB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
【数据分享】1929-2023年全球站点的逐年平均气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…...
探索Pyecharts关系图绘制技巧:炫酷效果与创意呈现【第42篇—python:Pyecharts水球图】
文章目录 Pyecharts绘制多种炫酷关系网图引言准备工作代码实战1. 基本关系网图2. 自定义节点样式和边样式3. 关系网图的层级结构4. 添加标签和工具提示5. 动态关系网图6. 高级关系网图 - Les Miserables 示例7. 自定义关系网图布局8. 添加背景图9. 3D 关系网图10. 热力关系网图…...
蓝桥杯-循环节长度
两个整数做除法,有时会产生循环小数,其循环部分称为: 循环节。比如,11/136>0.8461553846153..... 其循环节为[846153] 共有 6 位。下面的方法,可以求出循环节的长度。请仔细阅读代码,并填写划线部分缺少的代码。 注…...
Jython调用openwire库连接activemq转发topic订阅消息到另一个activemq 服务器上 完整代码
以下是一个示例代码,演示如何在Jython中使用OpenWire库连接ActiveMQ,将一个主题(topic)上的订阅消息转发到另一个ActiveMQ服务器上: from org.apache.activemq import * from org.apache.activemq.transport import *…...
面试经典题---30.串联所有单词的子串
30.串联所有单词的子串 我的解法: 滑动窗口: 解法中用到了两个哈希表map1和map2,分别用于记录words中各个单词的出现频数和当前滑动窗口[left, right)中单词的出现频数;外部for循环i从0到len - 1,内部while循环每次会…...
字符串随机生成工具(开源)-Kimen(奇门)
由于最近笔者在开发数据脱敏相关功能,其中一类脱敏需求为能够按照指定的格式随机生成一个字符串来代替原有信息,数据看起来格式需要与原数据相同,如:电话号码,身份证号以及邮箱等。在网上搜索了下,发现没有…...
UE4 CustomDepthMobile流程小记
原生UE opaque材质中获取CustomDepth/CustomStencil会报错 在其Compile中调用的函数中没有看到报错逻辑 材质节点的逻辑都没有什么问题,所以看一下报错 在HLSLMaterialTranslator::Translate中 修改之后 mobile流程的不透明材质可以直接获取SceneTexture::customd…...
Docker 基础篇
目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成(Docker 三要素) 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …...
Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?
Git的基本概念:Git是一个版本控制系统,用于管理代码的变更历史记录。核心概念包括仓库、分支、提交和合并。 1、可以帮助开发者合并开发的代码 2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 3、代码文件版本管理 问题描述 当我们使用git提交代码…...
vue3封装el-pagination分页组件
1、效果如图: 2、分页组件代码: <template><div class"paging"><el-config-provider :locale"zhCn"><el-paginationv-model:current-page"page.currentPage"v-model:page-size"page.pageSize…...
负载均衡下Webshell连接思路及难点
君衍. 一、应用场景二、环境搭建三、思路以及难点1、查看内部结构2、查看webshell3、使用蚁剑进行连接4、难点1 shell文件上传问题5、难点2 命令执行时飘逸6、难点3 大工具上传失败7、难点4 脚本失效 四、解决方式1、关闭对方节点服务器2、基于IP地址判断是否执行3、脚本实现流…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
GB/T 43887-2024 核级柔性石墨板材检测
核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标: 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...
