djang urls.py 无名有名分组,反向解析,路由分发,名称空间,伪静态,虚拟环境,django版本...

本文详细介绍了Django的路由匹配、重定向、分组、反向解析以及路由分发。讲解了如何设置APPEND_SLASH选项,正则表达式在URL配置中的使用,包括无名和有名分组,并展示了反向解析的方法。此外,还讨论了路由分发在大型项目中的应用,以及虚拟环境和不同Django版本间的URL模式差异。对于SEO优化,提到了伪静态的概念和重要性。
摘要由CSDN通过智能技术生成

路由层

路由匹配:APPEND_SLASH = False , 取消自动补全 , settings.py 中添加字段即可

若url尾部为书写/ , django内部会自动补全

urls.py 中 对应关系正确书写方式

url(r'^admin/$', admin.site.urls)

首页重定向

urls(r'^$',views.start)

无名分组

无名分组就是将括号内正则表达式匹配到的内容当做位置参数传递给后面的视图函数

分组:将某一段正则表达式用小括号括起来

举例:

url(r'^index/(\d+)/',views.index)
def index(request,xxx):
    print(xxx) # 输出:111
    return  HttpResponse('想')

有名分组

有名分组就是将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数。

url(r'^indexadd/(?P<year>\d)',views.indexadd)
def indexadd(request,year):
  	print(year)
    return HttpResponse('么么')

无名有名是否可以混合使用?不能,但是同一个分组可以使用N次。

无名分组

url(r'^index/(\d+)/(\d+)/(\d+)/', views.index)
def index(request,*args,**kwargs):
    print(args) # 输出:('111', '222', '333') <class 'tuple'>
    print(kwargs) # 输出:{}
    return  HttpResponse('想')

有名分组

url(r'^index/(?P<name>)/(?P<age>)/(?P<hobby>)/',views.indexadd)
def indexadd(request,*args,**kwargs):
    print(args, type(args)) # () <class 'tuple'>
    print(kwargs,type(kwargs)) # {'name': '1', 'age': '2', 'hobby': '3'} <class 'dict'>
    return HttpResponse('么么')

反向解析,导入摸快reverse

通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数

对应关系,urls.py
url(r'^$',views.home),
    url(r'^func_lkkk/',views.func,name='ooo')
视图函数层,views.py

获得

from django.shortcuts import render,HttpResponse,reverse

def home(request):
    print(reverse('ooo')) # /func_lkkk/ , <class 'str'>
    return render(request,'func.html')

def func(request):
    return HttpResponse('aaa')
templates,静态文件
<a href="{% url 'ooo' %}">func</a>

那么这个数字写代码的时候应该放什么?

数字一般情况下放的是数据的主键值,数据的编辑和删除。

无名分组反向解析

url(r'^func_lkkk/(\d+)/',views.func,name='ooo')
def home(request):
    print(request)
    return render(request,'func.html')

def func(request,*args,**kwargs):
    a = reverse('ooo',args=(1,))
    print(a) # /func_lkkk/1/,字符串
    return HttpResponse('aaa')
  
<body>
<a href="{% url 'ooo' 11 %}">func</a>
</body>

有名分组反向解析

url(r'^func_lkkk/(?P<year>\d+)/',views.func,name='ooo')

  前端:两种
  <a href="{% url 'ooo' 11 %}">func</a>
	<a href="{% url 'ooo' year=11 %}">func</a>

  后端:两种
      print(reverse('ooo',kwargs={'year':11}))
      print(reverse('ooo',args=(11,)))
url(r'^func_lkkk/(?P<year>\d+)/',views.func,name='ooo')
  	
def home(request):
    print(request)
    return render(request,'func.html')

def func(request,*args,**kwargs):
    print(reverse('ooo',kwargs={'year':11}))
    print(reverse('ooo',args=(11,)))
    return HttpResponse('ss')

路由分发

Django 的每一个应用都可以有自己的templates文件夹, urls.py 文件夹,static文件夹

正式基于上述的特点,Django能够非常好的做到分组开发(每个人只写自己的app),作为组长,只需要将手下书写的app全部拷贝到一个新的Django项目中,再再配置文件中注册所有的app再利用路由分发的特点所有的app整合即可。

当Django项目中的url特别多的时候,总路由urls.py代码非常冗余不好维护,这是也可以利用路由分发来减轻总路由的塔里。

利用路由分发之后,总路由不再与视图函数具有直接的对应关系,而是分发处理,识别当前url是属于那个应用下,直接分发对应的应用做处理。

项目中若无 urls.py 文件夹则手动创建

# app01/urls
urlpatterns = [
    url(r'^sex/',views.sex)
]
def sex(request):
    return HttpResponse('app01 sex')
  
# app02/urls
urlpatterns = [
    url(r'^sex/',views.sex)
]
def sex(request):
    return HttpResponse('app02 sex')
  
# 总路由
from django.conf.urls import url,include
# 第一种:
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls'))
]

# 第二种:
    url(r'^app01/', include(app01_urls)),  # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/', include(app02_urls))

名称空间

当多个应用出现相同别名,反向解析不会自动识别应用前缀

# 名称空间
	# 总路由
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
# 解析的时候
  	# app01
  	urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
		]
    # app02
    urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
		]
    
    reverse('app01:reg')
    reverse('app02:reg')
    
    {% url 'app01:reg' %}
    {% url 'app02:reg' %}

其实只要保证名字不冲突 就没有必要使用名称空间。一般情况下,有多个app的时候我们在起别名的时候会加上app的前缀,这样的话就能够确保多个app之间名字不冲突的问题。

urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
    url(r'^reg/',views.reg,name='app02_reg')
]

伪静态

"""
静态网页
	数据是写死的 万年不变
	
伪静态
	将一个动态网页伪装成静态网页
	
	为什么要伪装呢?
		https://www.cnblogs.com/Dominic-Ji/p/9234099.html
		伪装的目的在于增大本网站的seo查询力度
		并且增加搜索引擎收藏本网上的概率
	
	搜索引擎本质上就是一个巨大的爬虫程序
	
	总结:
		无论你怎么优化 怎么处理
		始终还是干不过RMB玩家
"""
urlpatterns = [
    url(r'^reg.html',views.reg,name='app02_reg')
]

虚拟环境

django版本区别

django1.X路由层使用的是url方法,而在django2.Xhe3.X版本中路由层使用的是path方法

url()第一个参数支持正则
	path()第一个参数是不支持正则的 写什么就匹配什么
	
	
	如果你习惯使用path那么也给你提供了另外一个方法
		from django.urls import path, re_path
		from django.conf.urls import url
		
		re_path(r'^index/',index),
    url(r'^login/',login)
  2.X和3.X里面的re_path就等价于1.X里面的url

虽然path不支持正则 但是它的内部支持五种转换器, 路由层

path('index/<int:id>/',index)
	# 将第二个路由里面的内容先转成整型然后以关键字的形式传递给后面的视图函数

	def index(request,id):
    print(id,type(id)) # 输入数字,输出  数字 int 类型
    return HttpResponse('index')
  
  """
  str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
	int,匹配正整数,包含0。
	slug,匹配字母、数字以及横杠、下划线组成的字符串。
	uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
	path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
  """

除了有默认的五个转换器之外 还支持自定义转换器(了解)

https://www.cnblogs.com/xiaoyuanqujing/articles/11642628.html

博客最底部

模型层里面1.X外键默认都是级联更新删除的,但是到了2.X和3.X中需要你自己手动配置参数

models.ForeignKey(to='Publish')
	
	models.ForeignKey(to='Publish',on_delete=models.CASCADE...)

至此路由层结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值