Django从入门到精通(一)

news2024/9/20 16:01:03

目录

一、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 path

from django.shortcuts import HttpResponse

def 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 views

urlpatterns = [
    path('home/', views.home),
    path('news/<int:nid>/edit/', views.news),
    path('article/', views.article),
]

path()第一个参数是我们需要在浏览器访问的url地址,第二个参数是函数名。

views.py

from django.shortcuts import render, HttpResponse


def 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,HttpResponse

def getApiName(request):
    return HttpResponse("编程抗氧化——api")

urls.py

urlpatterns = [
    path('getApiName/', views.getApiName),
]

第三步:对web模块进行操作

views.py

from django.shortcuts import render, HttpResponse


def 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,include

urlpatterns = [
    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, redirect

def 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, redirect

def auth(request):
    return HttpResponse("auth")


def login(request):
    from django.urls import reverse
    url = 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,重定向301
	http://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.coloradmin.cn/o/1398802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《软件方法》强化自测题-杂项(3)-少林足球巴别塔-不属于“软件方法建模师”考察范围

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 本套自测题不属于“软件方法建模师”考察范围。 自测链接&#xff1a;https://www.101test.com/cand/index?paperIdQR6CGK 1. [单选] 著名歌曲《橄榄树》&#xff08;不要问我从那…

端口映射的定义、特点、场景、实例、常见问题回答(Port Mapping)

目 录 一、端口映射&#xff08;Port Mapping&#xff09; 二、端口映射应用场景&#xff08;什么时候用到端口映射&#xff09; &#xff08;一&#xff09;、使用端口映射的条件 &#xff08;二&#xff09;使用端口映射的具体场景 三、端口映射技术的特点 …

内网安全管理系统(保密管理系统)

在当今信息化的时代&#xff0c;企业的内网已经成为其核心资产的重要组成部分。 随着企业的快速发展和信息化程度的提升&#xff0c;内网安全问题日益凸显&#xff0c;如何保障内网的安全和机密信息的保密性&#xff0c;已经成为企业亟待解决的问题。 内网安全管理系统(保密管…

Docker项目部署()

1.创建文件夹tools mkdir tools 配置阿里云 Docker Yum 源 : yum install - y yum - utils device - mapper - persistent - data lvm2 yum - config - manager -- add - repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker - ce.repo 更新 yum 缓存 yum makec…

大路灯和护眼台灯哪个好?2024五款大路灯推荐

家用照明发展至今&#xff0c;从古时的匡衡凿壁借光读书&#xff0c;到后面的油灯、蜡烛等照明方式&#xff0c;再到近代的普通白炽灯&#xff0c;荧光灯、LED等电致发光灯具&#xff0c;发展到现在&#xff0c;科技在进步&#xff0c;文明在升级&#xff0c;照明灯具早已不再仅…

各种Linux版本安装Docker

文章目录 一、Ubuntu 20.04.61. 网卡和DNS配置2. Docker安装 二、CentOS Linux 7.91. 网卡和DNS配置2. Docker安装 三、Alibaba Cloud Linux 31. DNS配置2. repo说明3. Docker安装 四、验证是否安装成功 一、Ubuntu 20.04.6 1. 网卡和DNS配置 /etc/netplan 找到 *.yaml 文件 …

YOLOv8全网首发:新一代高效可形变卷积DCNv4如何做二次创新?高效结合SPPF

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,与YOLOv8 SPPF高效结合 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡💡💡…

bgp选路

完成基础配置后&#xff1a; 配置bgp&#xff08;如r2&#xff09;&#xff1a; 全布配置与重发布完成后&#xff1a;全网可达 起源属性修改选路&#xff1a;

LeetCode 0082.删除排序链表中的重复元素 II:模拟

【LetMeFly】82.删除排序链表中的重复元素 II&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/ 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字…

2023年十款开源测试开发工具推荐(自动化、性能、造数据、流量复制)

1、AutoMeter-API 自动化测试平台 AutoMeter 是一款针对分布式服务&#xff0c;微服务 API 做功能和性能一体化的自动化测试平台&#xff0c;一站式提供发布单元&#xff0c;API&#xff0c;环境&#xff0c;用例&#xff0c;前置条件&#xff0c;场景&#xff0c;计划&#xf…

家教上门助教小程序源码,家教小程序,家教系统,家教app,家教源码

家教上门助教小程序源码&#xff0c;家教小程序&#xff0c;家教系统&#xff0c;家教app&#xff0c;家教源码 推荐使用宝塔面板Linux NginxPHPMYSQL 支持家教老师筛选 支持家教人员入住 支持购买课程 支持教学资讯 支持订单课程

剪映导入素材全是绿屏解决方案

自己导入的视频或者是使用素材库里面的素材导入&#xff0c;结果都是一样全都是绿屏 网上找到原因是&#xff1a;兼容性或者软件的问题。 结果方案 &#xff1a; 菜单--全局设置 全局设置--性能。 把启用硬件加速编码和启动硬件加速解码俩个复选框取消掉&#xff01;重启一下…

某马头条——day06

自媒体文章上下架 使用消息队列在自媒体下架时通知文章微服务。 kafka概述 kafka环境搭建 docker pull zookeeper:3.4.14 docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 安装kafka docker pull wurstmeister/kafka:2.12-2.3.1 docker run -d --name kafka…

CVE-2023-46226 Apache iotdb远程代码执行漏洞

项目介绍 Apache IoTDB 是针对时间序列数据收集、存储与分析一体化的数据管理引擎。它具有体量轻、性能高、易使用的特点&#xff0c;完美对接 Hadoop 与 Spark 生态&#xff0c;适用于工业物联网应用中海量时间序列数据高速写入和复杂分析查询的需求。 项目地址 https://io…

像 Google SRE 一样 OnCall

在 Google SRE 的著作《Google运维解密》(原作名&#xff1a;Site Reliability Engineering: How Google Runs Production Systems)中&#xff0c;Google SRE 的关键成员们几乎不惜用了三个章节的篇幅描述了在 Google 他们是如何 OnCall 的。 Google SRE 实践中&#xff0c;有…

python--re库

目录 re库初识 re库基础使用方法 compile()函数 基本用法 正则表达式常用规则字符 match与search方法 match search match/search findall与finditer方法 使用findall()返回所有匹配项 使用findall()提取多个组的匹配 使用finditer()逐个返回Match对象 使用findi…

会声会影2024旗舰版新功能介绍及2024最新视频制作教程

随着科技的不断发展&#xff0c;视频制作已经不再是专业人士的专属领域&#xff0c;越来越多的人开始使用各种视频制作软件来记录生活、创作内容。其中&#xff0c;会声会影是被广泛使用的一款视频制作软件&#xff0c;其旗舰版更是备受关注。 据悉&#xff0c;会声会影2024旗舰…

pyqt5+python子域名扫描程序

import sysfrom PyQt5 import uic from PyQt5.QtWidgets import * #requests库内置了不同的方法来发送不同类型的http请求 import requests#BS主要功能是从网页抓取数据&#xff0c;提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能 from bs4 import Beau…

Google Gemini API快速上手

一、前言 12月6日&#xff0c;谷歌发布新一代大模型Gemini的demo, 同时&#xff0c;Bard已将模型更新为Gemini Pro Gemini 是谷歌目前最新最强的大语言模型&#xff0c;支持多模态&#xff08;文字&#xff0c;图片&#xff0c;音频&#xff0c;视频等等&#xff09;处理 美…

K8S--部署Nacos

原文网址&#xff1a;K8S--部署Nacos-CSDN博客 简介 本文介绍K8S部署Nacos的方法。Nacos版本是&#xff1a;2.2.3。 部署方案 本文为了简单&#xff0c;使用此部署方式&#xff1a;使用本地pvconfigmap&#xff0c;以embedded模式部署单机nacos。以nodePort方式暴露端口。 …