day05 django框架之路由层


day05 django框架之路由层

今日内容概要

  • 简易版django请求声明周期流程图(重要)
  • 路由匹配
  • 无名有名分组
  • 反向解析
  • 无名有名解析
  • 路由分发
  • 名称空间
  • 伪静态
  • 虚拟环境

简易版django请求声明周期流程图(重要)

路由匹配

# 路由匹配
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'test', views.test),     
    url(r'testadd', views.testadd),
]   # 所以页面输出的永远都是test对应的视图函数

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 首页
    url(r'^$', views.home)
    # 路由匹配
    url(r'^test/$', views.test),   # 不建议使用$符号,因为可能后面还会跟一些参数
    url(r'^testadd', views.testadd),
    # 尾页
    url(r'',views.error)
]
	
特性1:
	'''
	url方法第一参数是正则表达式
	只要第一个参数正则表达式能够匹配到内容,那么就会停止匹配,执行对应的视图函数
	'''
    
特性2:
    '''
    在输入url的时候会默认输出斜杠?
    是django内部做的重定向
    第一次匹配不行,url后面加斜杠再来一次
    '''
    # 取消django默认加斜杠,修改settins.py文件,添加:
    	APPEND_SLASH = False    

无名分组

分组:就把是正则表达式用小括号括起来

# 无名分组:
	url(r'^test/(\d+)/', views.test),   # \d+ :配置到1个或者多个数字
    
    def test(request,*args,**kwargs):
    	print(args,kwargs)         # ('1314',) 
    return HttpResponse('test')
    # 总结:无名分组就是将括号内正则表达式匹配到的内容当做位置参数传递给后面的视图函数
    # 会以元祖的方式传递过来
    
# 验证无名分组和有名分组可以混用吗?
    答:不能混用
    url(r'^index/(\d+)/(?P\d+)/',views.index)
    
# 单个分组可以使用多次
    url(r'^test/(\d+)/(\d+)/(\d+)',views.test)
    url(r'^index/(?P\d+)/(?P\d+)/',views.index)

有名分组

有名分组:可以给正则表达式起一个别名

# 有名分组:
    url(r'^test/(?P\d+)/',views.test)  # ?P :给\d+ 起了个别名叫做year
    
    def test(request,*args,**kwargs):
    	print(args,kwargs)         # {'year': '1314'}
    return HttpResponse('test')
    # 总结:无名分组就是将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数
    # 会以字典的方式传递过来

反向解析

反向解析:通过一些方法得到一个结果,该结果可以访问到对应url从而触发视图函数的运行
# 域名解析:相当于起了一个别名。 name='唯一标识'

# 如果产品经理叫你改url后缀名,但是一改会有许多网址失效,这时候就用到name起别名了
# 动态获取修改的别名和url的是一样的
1、在路由层书写正则与函数名的时候 在后面加一个唯一标识
	url(r'^func/',views.func,name='my_func')
    
2、前端反向解析
	{% url 'my_func' %}
    
3、后端反向解析
	# url(r'^funcddd/',views.func,name='my_func')  修改后
	from django.shortcuts import reverse   # 用reverse模块可以在后端实时跳转到url
    print(reverse('my_func'))
    http://127.0.0.1:8000/funcddd/
"""
通过标记解析出一个结果 该结果可以访问到标记所在的那一行地址
无论怎么后缀名怎么改,都可以实时获取后缀名,从而进入到对应的视图函数
"""

无名有名分组反向解析

# 无名分组反向解析
    url(r'^func/(\d+)/',views.func,name='my_func')   
	print(reverse('my_func'))   # 报错,除了反向解析,还需要一个参数,而且必须让正则匹配上
    后端:
        def home(request):
        	print(reverse('my_func', args=(10,)))  # 需要一个参数才能匹配上
        return render(request,'home.html')
    
    	def func(request,*args):  # 加上无名分组需要一个参数接收
        	return HttpResponse('func')
        
    前端:
    	111
        
# 这个数字写代码的时候应该放什么?
	数字一般情况下放的是数值的主键值,一般用作数据的编辑和修改

有名分组反向解析

# 有名分组反向解析 
	    
	url(r'^index/(?P\d+)',views.index,name='my_index')
    后端:
    	def home(request):
            # 有名分组反向解析
            print(reverse('my_index',kwargs={'year':123}))
            return render(request,'home.html')

        def index(request,year):
            return HttpResponse('index')
        
	前端:
        111
        
    # 简单写法:推荐使用这种方法
    	print(reverse('my_index', args=(10,))) 
        111
        """其实无名有名反向解析可以使用通用的方式"""
	    都可以使用无名分组的反向解析

路由分发

当django项目特别庞大的时候 如果所有的路由匹配都写在项目的总路由中会导致总路由过于复杂不利于维护 此时可以将路由做拆分
"""
django支持所有的应用都可以拥有自己的
	urls.py 
	templates文件夹 
	static文件夹
也就意味着多人协同开发变得更加的简单了
"""
如何将多个单独的app组织到一起 >>> 路由分发
'''
利用路由分发之后,总路由不再路由与视图函数的直接对应关系
而是做一个分发处理
	识别当前url是哪个应用下的,直接分发给对应的应用去处理
'''
# 总路由:include
总路由
	from app01 import urls as app01_urls  # 当名字冲突了,用起别名的方式解决
	from app02 import urls as app02_urls  
    from django.conf.urls import url,include
    # 路由分发
    url(r'^app01/',include(app01_urls)), # 只要url前缀是app01开头,全部交给app01处理
    url(r'^app02/',include(app02_urls)), # 只要url前缀是app02开头,全部交给app02处理
子路由
	from django.conf.urls import url
    from app01 import views
    urlpatterns = [
        url(r'^index/',views.index)
    ]
子路由
	from django.conf.urls import url
    from app02 import views
    urlpatterns = [
        url(r'^index/',views.index)
    ]
 
# 更加简便的写法
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls')),
    # 总路由中不能加$,不然匹配不上后面的。

名称空间(了解)

# 当多个app中出现了相同的别名 那么使用反向解析无法自动识别
# 使用名称空间namespace,会自动识别

总路由
	# 名称空间
    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的前缀
		这样的话就能确保多个app之间名字不冲突的问题
		可以在起别名的时候加上应用名前缀		
			app01_my_index
			app02_my_index
"""
urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')  # 加上前缀
]

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

伪静态(了解)

静态页面
	数据写死的 不怎么改变的
伪静态页面
	看似是文件其实是动态网页 这么做事为了提高网站被搜索引擎收录的概率
将路径后缀改为.html形式即可

为什么要伪装?
	伪装的目的在于增大本网站的seo查询力度
    并且增加搜索引擎收藏本网站的概率
    
# 怎么编程静态网页呢
	urlpatterns = [  
    url(r'^reg.html/',views.reg,name='app01_reg')  # 加上前缀
]   # 在url后缀加上.html,但是一般不用。

虚拟环境(了解)

虚拟环境能够实现针对不同的项目配备专属的编程环境
创建虚拟环境相当于重新下载了一个新的解释器

# 但是虚拟环境不要下载太多,是需要消耗硬盘空间的
虚拟环境的唯一表示是venv文件夹

相关