Django(四、路由层)

文章目录

一、路由层

1.路由匹配

Django 1.x中第一个参数是正则表达式

Django 2.x 及以上版本 path第一个参数写的是什么就匹配什么,匹配到直接执行对应的视图函数,精准匹配不支持正则表达式

settings配置文件内添加(控制django是否自动添加斜杠匹配)

python 复制代码
APPEND_SLASH = False/True   # 默认是True自动添加斜杠

如果不想每次点击http://127.0.0.1:8000/跳转出报错的话可以在路由里指定

python 复制代码
url(r'^$', views.test),

为空的时候加载页面为test

url方法第一个是参数 的正则表达式

python 复制代码
urlpatterns = [
    path('^admin/', admin.site.urls),
    # 首页 默认进去
    path('^$',views.home),
    # 路由匹配
    path('^test/$',views.test),
    path('^testadd/$',views.testadd),
    # 尾页(了解 后期异常捕获)
    path('',views.error),
]

解析:
    ^	: 开头
    $	: 结尾 

二、正则无名分组与有名分组

无名分组

无名分组就是给某一段正则表达式用括号括起来

python 复制代码
url(r'^test/(\d+)/$', views.test)
无名分组:会将括号内正则表达式匹配到的内容当做位置参数传递给视图函数

get请求的第一种方式:

http://127.0.0.1:8000/test/?a=1\&b=2

get请求的第二种方式:

http://127.0.0.1:8000/test/123/11

代码实现

python 复制代码
urls.py
# 会把括号中匹配的数字当成位置参数传给视图函数
url(r'^test/(\d+)/$',views.test)


views.py
def test(request,xx):
    print(xx)
    return HttpResponse('test')
  
正则:    
\d+	: 匹配任意数字

有名分组

python 复制代码
url(r'^test/(?P<year>\d+)/(?P<month>\d+)$', views.test),
有名分组就是把正则中小括号里的匹配到的内容以关键字参数的形式传递给视图函数

有名无名不可以混合使用,但是可以分别多次使用
python 复制代码
1.无名分组单个使用多次
path('^index/(\d(4))/(\d(4))/(\d(4))/',views.index),

2.有名分组单个使用多次
path('^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),

def index(request,*args,**kwargs):
    print(args)
    return HttpResponse('index')

三、反向解析

路由频繁变化的时候,html页面与后端上的链接地址如何做到动态解析呢?

通过在url里面设置路由和视图函数的别名,动态解析出对应的路由,该路由直接执行对应的函数,函数直接执行对应的url

1.概念

通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数,实现url路由频繁变化,HTML界面与后端动态解析链接地址操作步骤:

python 复制代码
1.反向解析器路由配置
url(r'^1/2/3/4/testadd/$', views.testadd, name='testadd'),  # name='testadd' 起别名
前后端反向解析
2.在视图文件中导入模块reverse
from django.shortcuts import render,HttpResponse,redirect,reverse
3.反向解析  reverse('testadd')
def test(request):
    print(reverse('testadd'))
    return render(request,'index.html')
前端反向解析
4.前端模板文件反向解析
<a href="{% url 'testadd' %}">点击跳转</a>

无名分组动态路由解析

python 复制代码
1.反向解析路由配置
url(r'^1/2/3/4/testadd/(\d+)/(\d+)/$', views.testadd, name='testadd'),

2.在视图文件中导入reverse模块
from django.shortcuts import render,HttpResponse,redirect,reverse

3.反向解析 reverse('testadd' args='(1,123)')
def test(request,*args,**kwargs):
	res = reverse('testadd')
	print(res)
	print(args,kwargs)
	return render(request,'index.html')
	
前端反向解析
4.前端模板文件反向解析
<a href="{% url 'testadd' 1 123 %}">点击跳转</a>  根据路由来需要添加2个参数

有名分组动态路由解析

python 复制代码
1.反向解析路由配置
url(r'^1/2/3/4/testadd/(?P<year>\d+)/(?P<month>\d+)/$', views.testadd, name='testadd'),

2.在视图文件中导入reverse模块
from django.shortcuts import render,HttpResponse,redirect,reverse

3.反向解析
reverse('testadd' args='(1,123)')
reverse('testadd' kwargs={'year':1,'month':123})

def test(request,*args,**kwargs):
	res = reverse('testadd')
	print(res)
	print(args,kwargs)
	return render(request,'index.html')
	
前端反向解析
4.前端模板文件反向解析
<a href="{% url 'testadd' year=1 month=123 %}">点击跳转</a>  根据路由来需要添加2个关键字参数

四、路由分发

django支持每个应用都可以由自己独立的路由层(url.py)、静态文件(static文件夹)、模板层(templates)。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起

为什么要用路由分发?
  • 解决项目的总路由匹配关系过多的情况
  • 总路由分开于干路由与视图函数的的直接对应关系
  • 总路由是一个分发处理(识别当前url是属于哪个应用下的,直接分发对应的应用去处理)
  • 当请求来了,总路由不做对应关系,根据请求直接访问哪个app的功能,直接将请求发送给对应的app
  • 提前创建好应用app01(创建即注册)、app02,然后记得注册app02

1.总路由分发配置

使用路由分发之前,总路由直接干路由与属于函数的匹配

方式一:

python 复制代码
1.需要导入一个include路由分发模块
from django.conf.urls import url,include
2.导入子路由的urls  为了重名,起别名
from app01 import urls as app01------urls
from app02 import urls as app02------urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 1.路由分发
    url(r'^app01/',include(app01_urls)),  # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/',include(app02_urls))   # 只要url前缀是app02开头 全部交给app02处理
]

方式二:

python 复制代码
1.需要导入一个include路由分发模块
from django.urls import path,include
2.总路由分发  简易>>>推荐
urlpatterns = [
# 路由分发终极写法 简便
    path('app01/',include('app01.urls')),
    path('app02/',include('app02.urls'))

名称空间

路由分发之后,针对相同的别名是否能自动反向解析不同的应用前缀,默认情况下是无法直接识别应用前缀的,如果想要正常识别应用前缀,有以下两种方式:

python 复制代码
总路由
path('app01/',include(('app01.urls','app01'),namespace='app01')),  # 创建了名称空间app01
path('app02/',include(('app02.urls','app02'),namespace='app02')),  # 创建了名称空间app02

反向解析
后端
def index(request):
	print(reverse('app01:index_view'))
    return HttpResponse ('index from app01')

def index(request):
    print(reverse('app02:index_view'))
    return HttpResponse reverse('app02:index_view')

前端页面
{% url 'app01:index_view'%}

子路由:
urlpatterns = [
   url('^index/',views.index,name='index_view')
]
urlpatterns = [
    url('^index/',views.index,name='index_view')
]

方式2:别名不冲突即可 利用应用名作为别名的前缀

python 复制代码
1.总路由
urlpatterns = [
    url('admin/', admin.site.urls),
    # 路由分发
    url('app01/',include('app01.urls')),
    url('app02/',include('app02.urls'))
]

2.子路由
urlpatterns = [
  url('index/',views.index,name='app01_index_view')
  url('index/',views.index,name='app02_index_view')
]
3.后端
 reverse('app01_index_view')
 reverse('app02_index_view')

总结:只要保证名字不冲突骂我们就没必要使用名称空间,直接在路由起别名的时候加载app名作为别名的前缀

五、伪静态的概念

python 复制代码
伪静态: 其实就是把动态页面改成静态页面
动态页面:
	"""它不是在html页面中写死的,它是根据后端的数据变化而变化"""
    我们的页面上的数据是从数据库查询出来都是可以是动态页面
    
静态页面:
	html
     css
案例:
	https://www.cnblogs.com/bigsai/p/17827160.html # 这个就是伪装之后的页面
伪装的目的:
	"""为了更好的被各大搜索引擎抓大,静态页面是最容易被抓到的,有个别的网站就会做伪装,seo"""
    seo:优化关键词被容易搜索到
    sem: 广告(RMB)
怎么样去伪装	 
	url(r'^v1/v2/test.html/$', views.test)

六、虚拟环境

什么是虚拟环境?

python 复制代码
项目1需要使用:django1.11 								 python38
项目2需要使用:django2.22 pymysql requests			      python38
项目3需要使用:django3.22 request_html flask urllib3		 python38
    
  虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
  pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器)

实际开发过程,我们需要给不同的项目配备不同的环境,项目需要用到的环境是什么我们就给装什么样的环境。一般不用的我们不装,因为虚拟环境创建太多(第三方模块或者工具太),是会消耗硬盘空间。

​ 目前我们不使用虚拟环境,所有的模块统一下载到本地

如何创建虚拟环境?

1.pycharm创建虚拟环境

python 复制代码
1、创建虚拟环境
2、虚拟环境标志
3、虚拟环境下载django
4、使用虚拟环境

如果下载过程出现问题了,就复制提示的解决方法到文件上方框里去执行
pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com

django1和django2的区别

1. 路由文件

django1.x中使用的是url:支持正则

django2.x中使用的是path(不支持正则:精准匹配)和re_path(url):支持正则

path:但是它只支持五种转换器

Django默认支持以下5个转化器:

● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

● int,匹配正整数,包含0。

● slug,匹配字母、数字以及横杠、下划线组成的字符串。

● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

相关推荐
一 乐21 分钟前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·数据库·学习·考研·微信·小程序·源码
一 乐22 分钟前
租拼车平台|小区租拼车管理|基于java的小区租拼车管理信息系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·微信·notepad++·拼车
BillDev34 分钟前
Oracle创建用户报错-ORA-65096: invalid common user or role name
数据库·oracle
szial39 分钟前
深入理解SQL模糊查询中的特殊字符处理——以DB2为例
数据库·sql
jxxchallenger41 分钟前
踩坑spring cloud gateway /actuator/gateway/refresh不生效
java·数据库·gateway
肥or胖1 小时前
【MySQL】索引
linux·数据库·mysql
Kiwi233331 小时前
产品经理-需求分析
数据库·产品经理·需求分析
读心悦2 小时前
修改 MySQL 数据库中的唯一键
数据库·mysql
call_me_wangcheng2 小时前
django创建项目
python·django
qq_213157892 小时前
(c#)unity中sqlite多线程同时开启事务会导致非常慢
数据库·sqlite·c#