当前位置: 首页 > news >正文

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虚拟环境【安装指…...

数据库分表分库的原则

什么是数据库分库分表 数据库分表&#xff08;Table Sharding&#xff09; 数据库分表是将一个大表按照某种规则拆分成多个小表存储在不同的物理表中的技术。通常&#xff0c;拆分规则是基于某个列的值进行拆分&#xff0c;例如根据用户ID或日期范围等进行拆分。每个小表只包…...

Java技术栈 —— Docker容器

Java技术栈 —— Docker容器 一、什么是Docker&#xff1f;二、如何安装Docker&#xff1f;三、如何使用Docker&#xff1f; 一、什么是Docker&#xff1f; docker的本意是码头工人。 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个…...

Mysql大数据量分页优化

前言 之前有看过到mysql大数据量分页情况下性能会很差&#xff0c;但是没有探究过它的原因&#xff0c;今天讲一讲mysql大数据量下偏移量很大&#xff0c;性能很差的问题&#xff0c;并附上解决方式。 原因 将原因前我们先做一个试验&#xff0c;我做试验使用的是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架构师编辑器内容-添加自动保存的功能

对于频繁改动的应用&#xff0c;自动保存的功能是一个非常有用的功能&#xff0c;可以避免用户在没有保存的情况下丢失自己保存过的数据。 对于自动保存&#xff0c;一般有两种实现&#xff0c;参考语雀和石墨&#xff1a; 语雀采用的是定时保存的方式&#xff0c;大约在3分半…...

【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存&#xff1f; 2.Redis 一般在什么场合下使用&#xff1f; 3.redis为什么这么快&#xff1f; 4.Redis为什么要引入了多线程&#xff1f; 1.既然redis那么快&#xff0c;为什么不用它做主数据…...

SpringBoot之JWT登录

JWT JSON Web Token&#xff08;JSON Web令牌&#xff09; 是一个开放标准(rfc7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任&#xff0c;因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…...

【备战蓝桥杯】——循环结构

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-bFHV3Dz5xMe6d3NB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

【数据分享】1929-2023年全球站点的逐年平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…...

探索Pyecharts关系图绘制技巧:炫酷效果与创意呈现【第42篇—python:Pyecharts水球图】

文章目录 Pyecharts绘制多种炫酷关系网图引言准备工作代码实战1. 基本关系网图2. 自定义节点样式和边样式3. 关系网图的层级结构4. 添加标签和工具提示5. 动态关系网图6. 高级关系网图 - Les Miserables 示例7. 自定义关系网图布局8. 添加背景图9. 3D 关系网图10. 热力关系网图…...

蓝桥杯-循环节长度

两个整数做除法&#xff0c;有时会产生循环小数&#xff0c;其循环部分称为: 循环节。比如&#xff0c;11/136>0.8461553846153..... 其循环节为[846153] 共有 6 位。下面的方法&#xff0c;可以求出循环节的长度。请仔细阅读代码&#xff0c;并填写划线部分缺少的代码。 注…...

Jython调用openwire库连接activemq转发topic订阅消息到另一个activemq 服务器上 完整代码

以下是一个示例代码&#xff0c;演示如何在Jython中使用OpenWire库连接ActiveMQ&#xff0c;将一个主题&#xff08;topic&#xff09;上的订阅消息转发到另一个ActiveMQ服务器上&#xff1a; from org.apache.activemq import * from org.apache.activemq.transport import *…...

面试经典题---30.串联所有单词的子串

30.串联所有单词的子串 我的解法&#xff1a; 滑动窗口&#xff1a; 解法中用到了两个哈希表map1和map2&#xff0c;分别用于记录words中各个单词的出现频数和当前滑动窗口[left, right)中单词的出现频数&#xff1b;外部for循环i从0到len - 1&#xff0c;内部while循环每次会…...

字符串随机生成工具(开源)-Kimen(奇门)

由于最近笔者在开发数据脱敏相关功能&#xff0c;其中一类脱敏需求为能够按照指定的格式随机生成一个字符串来代替原有信息&#xff0c;数据看起来格式需要与原数据相同&#xff0c;如&#xff1a;电话号码&#xff0c;身份证号以及邮箱等。在网上搜索了下&#xff0c;发现没有…...

UE4 CustomDepthMobile流程小记

原生UE opaque材质中获取CustomDepth/CustomStencil会报错 在其Compile中调用的函数中没有看到报错逻辑 材质节点的逻辑都没有什么问题&#xff0c;所以看一下报错 在HLSLMaterialTranslator::Translate中 修改之后 mobile流程的不透明材质可以直接获取SceneTexture::customd…...

Docker 基础篇

目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成&#xff08;Docker 三要素&#xff09; 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …...

Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?

Git的基本概念:Git是一个版本控制系统,用于管理代码的变更历史记录。核心概念包括仓库、分支、提交和合并。 1、可以帮助开发者合并开发的代码 2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 3、代码文件版本管理 问题描述 当我们使用git提交代码…...

vue3封装el-pagination分页组件

1、效果如图&#xff1a; 2、分页组件代码&#xff1a; <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、脚本实现流…...

基于链表实现贪吃蛇游戏

本文中&#xff0c;我们将使用链表和一些Win32 API的知识来实现贪吃蛇小游戏 一、功能 &#xff08;1&#xff09;游戏载入界面 &#xff08;2&#xff09;地图的绘制 &#xff08;3&#xff09;蛇身的移动和变长 &#xff08;4&#xff09;食物的生成 &#xff08;5&…...

Python网络爬虫实战——实验6:Python实现js逆向与加解密

【实验内容】 本实验主要介绍在数据采集过程中对js代码进行分析从而对加密字段进行解密。 【实验目的】 1、理解js逆向工程的概念 2、学会逆向工程中的加解密分析 【实验步骤】 步骤1 理解js逆向工程的概念 步骤2 学会逆向工程中的加解密分析 步骤3 采集广东政府采购网 步…...

【python】使用aiohttp库编写一个简单的异步服务器

1. aiohttp介绍 aiohttp 是一个用于编写异步 HTTP 客户端和服务器的 Python 库。它建立在 Python 的 asyncio 库之上&#xff0c;提供了一种方便的方式来处理异步请求和响应。 官网地址&#xff1a;Welcome to AIOHTTP — aiohttp 3.9.1 documentation 以下是 aiohttp 的一些…...

新手使用代理IP接入代码教程

“实现匿名访问与数据保护在当今互联网高速发展的时代&#xff0c;网络安全和隐私保护成为了越来越重要的议题。代理IP可以隐藏用户的真实IP地址&#xff0c;从而实现匿名访问。为了保护用户的隐私和数据安全&#xff0c;许多网站和应用程序都采用了代理IP技术。” 一、代理IP的…...

JVM问题排查手册

三万字长文&#xff1a;JVM内存问题排查Cookbook 一、Heap快照 # jmap命令保存整个Java堆&#xff08;在你dump的时间不是事故发生点的时候尤其推荐&#xff09; jmap -dump:formatb,fileheap.bin <pid> # jmap命令只保存Java堆中的存活对象, 包含live选项&#xff0c;…...

前端canvas项目实战——简历制作网站(三)——右侧属性栏(线条宽度样式)

目录 前言一、效果展示二、实现步骤1. 实现线条宽度&#xff08;strokeWidth&#xff09;的属性模块2. 实线线条样式&#xff08;strokeDashArray&#xff09;的属性模块3. 意料之外的“联动” 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们初步实现了右侧属性栏…...

字节跳动二面经典题目

前言 语论即为「语兴式论语」&#xff0c;以语录体及对话的形式&#xff0c;沉淀球友实际工作学习中存在的疑难杂症解答&#xff0c;希望能够更好的帮助到球友和粉丝。欢迎关注公众号&#xff1a;语数 本期投稿 本期语数精选来源于球友应对字节跳动二面时候的场景问题 数仓工程…...

微搭低代码从入门到精通01应用介绍

目录 1 学习路线图2 应用介绍3 编辑器介绍总结 低代码的概念于2014年由 Forrester 首次正式提出。其将低代码定义为&#xff1a;能够以“最少的手写代码”和设置快速开发应用、配置和部署业务应用程序。 不同应用厂商的解法不一样&#xff0c;Gartner评估了400多款低代码/无代码…...

论文阅读《thanking frequency fordeepfake detection》

项目链接&#xff1a;https://github.com/yyk-wew/F3Net 这篇论文从频域的角度出发&#xff0c;提出了频域感知模型用于deepfake检测的模型 整体架构图&#xff1a; 1.FAD&#xff1a; 频域感知分解&#xff0c;其实就是利用DCT变换&#xff0c;将空间域转换为频域&#xff…...

ArcgisForJs快速入门

文章目录 0.引言1.前端代码编辑工具2.使用ArcgisForJs创建一个简单应用3.切片地图服务图层4.动态地图服务图层5.地图事件 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调用ArcGIS Server的REST API&#xff0c…...