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']

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件包含漏洞长度截断

长度截断 文件漏洞的利用方式什么是长度截断通过实操理解00截断对版本要求更高一点&#xff0c;而长度截断则是利用了windows的系统漏洞&#xff0c;就是windows文件名&#xff08;就是文件名后缀之后&#xff09;之后如果有空格&#xff0c;或者是点都会被忽略掉&#xff0c;也…

【GitHub项目推荐--游戏模拟器(switch)】【转载】

01 任天堂模拟器 yuzu 是 GitHub 上斩获 Star 最多的开源 Nintendo Switch 模拟器 &#xff0c;使用 C 编写&#xff0c;考虑到了可移植性&#xff0c;该模拟器包括 Windows 和 Linux 端。 如果你的 PC 满足必要的硬件要求&#xff0c;该模拟器就能够运行大多数商业游戏&…

Leetcode 第 111 场双周赛题解

Leetcode 第 111 场双周赛题解 Leetcode 第 111 场双周赛题解题目1&#xff1a;2824. 统计和小于目标的下标对数目思路代码复杂度分析 题目2&#xff1a;2825. 循环增长使字符串子序列等于另一个字符串思路代码复杂度分析 题目3&#xff1a;2826. 将三个组排序思路代码复杂度分…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

Linux之安装配置CentOS 7

一、CentOS简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;中文意思是社区企业操作系统&#xff09;是Linux发行版之一&#xff0c;它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码&#xff0c…

Linux/Academy

Enumeration nmap 首先扫描目标端口对外开放情况 nmap -p- 10.10.10.215 -T4 发现对外开放了22,80,33060三个端口&#xff0c;端口详细信息如下 结果显示80端口运行着http&#xff0c;且给出了域名academy.htb&#xff0c;现将ip与域名写到/et/hosts中&#xff0c;然后从ht…

Procexp64.exe —— 强大的进程管理器

1&#xff0c;简介 Process Explorer 是一款增强型的任务管理器&#xff0c;你可以使用它方便地管理你的程序进程&#xff0c;能强行关闭任何程序。 除此之外&#xff0c;它还详尽地显示计算机信息&#xff1a;CPU、内存使用情况&#xff0c;DLL、句柄信息&#xff0c;很酷的…

redis-4 搭建redis集群

1.为什么需要redis集群&#xff1f; Redis 集群提供了高可用性、横向扩展和数据分片等功能&#xff0c;使得 Redis 能够应对大规模的数据存储和高并发访问的需求。以下是一些需要使用 Redis 集群的常见情况&#xff1a; 高可用性&#xff1a;通过在多个节点之间进行数据复制和…

【动态规划】【逆向思考】【C++算法】960. 删列造序 III

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 动态规划汇总 LeetCode960. 删列造序 III 给定由 n 个小写字母字符串组成的数组 strs &#xff0c;其中每个字符串长度相等。 选取一个删除索引序列&#xff0c;对于 strs 中的每个字符串&a…

虹科数字化与AR部门升级为安宝特AR子公司

致关心虹科AR的朋友们&#xff1a; 感谢您一直以来对虹科数字化与AR的支持和信任&#xff0c;为了更好地满足市场需求和公司发展的需要&#xff0c;虹科数字化与AR部门现已升级为虹科旗下独立子公司&#xff0c;并正式更名为“安宝特AR”。 ”虹科数字化与AR“自成立以来&…

React中文官网已经搬迁了,原网址内容将不再更新

注意1&#xff1a;React中文官网已经搬迁至-React 官方中文文档&#xff0c;原网址内容将不再更新 注意2&#xff1a;React官网已经将React的定义由“用于构建用户界面的 JavaScript 库”更改为“用于构建 Web 和原生交互界面的库”。

SpringBoot系列之JPA实现按年月日查询

SpringBoot系列之JPA实现按年月日查询 通过例子的方式介绍Springboot集成Spring Data JPA的方法&#xff0c;进行实验&#xff0c;要先创建一个Initializer工程&#xff0c;如图&#xff1a; 选择&#xff0c;需要的jdk版本&#xff0c;maven项目 选择需要的maven配置&#x…

Python初学者学习记录——python基础综合案例:数据可视化——地图可视化

一、基础地图使用 1、基础地图演示 2、基础地图演示——视觉映射器 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 2…

高考复习技巧考研资料、美赛论文及代码,数据收集网站(初高中招生考试全科试卷等)

图&#xff0c;就要从“点、线、面的位置关系”这一内核开始发散&#xff0c;第一层级为彼此的位置关系&#xff0c;平行、相交、异面&#xff08;两直线间位置&#xff09;、垂直&#xff08;相交或异面中的特殊位置&#xff09;&#xff0c;多面体、旋转体等&#xff0c;然后…

基于springboot+vue的在线教育系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

使用Opencv-python库读取图像、本地视频和摄像头实时数据

使用Opencv-python库读取图像、本地视频和摄像头实时数据 Python中使用OpenCV读取图像、本地视频和摄像头数据很简单&#xff0c; 首先需要安装Python&#xff0c;然后安装Opencv-python库 pip install opencv-python然后在PyCharm或者VScode等IDE中输入对应的Python代码 一…

leetcode:二叉树的中序遍历(外加先序,后序遍历)

题外&#xff1a;另外三种遍历可以看这&#xff1a; 层序遍历&#xff1a; Leetcode:二分搜索树层次遍历-CSDN博客 先序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序遍历-CSDN博客 后序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序…

黑马程序员-瑞吉外卖-day5

修改实体类 package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode;i…

Python算法题集_接雨水

本文为Python算法题集之一的代码示例 题目42&#xff1a;接雨水 说明&#xff1a;给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]…

VMware虚拟机部署Linux Ubuntu系统

本文介绍基于VMware Workstation Pro虚拟机软件&#xff0c;配置Linux Ubuntu操作系统环境的方法。 首先&#xff0c;我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是&#xff0c;VMware Workstation Pro软件是一个收费软件&#xff0c;而互联网中有很…