Django之路由层

Django请求生命周期

路由配置

基本格式:

# Django1.X版本下的路由系统
from django.conf.urls import url
urlpatterns = [
    url(正则表达式, views视图函数,参数,别名),
]
# Django2.X版本下的路由系统
from django.urls import path
urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path(字符串, views视图函数,参数,别名)
]
# Django 1.X中的url与Django 2.X中的re_path用法一致,都是正则表达式。

 

#参数说明:
#正则表达式:一个正则表达式字符串
#views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
#参数:可选的要传递给视图函数的默认参数(字典形式)
#别名:一个可选的name参数

  当前面的正则匹配到了内容,就不会再往下进行匹配,而是直接执行对应的视图函数。由于这种特性,当所写的项目比较庞大时,url的前后顺序也需要考虑,否则可能会出现url错乱的情况。

  django在路由的匹配的时候,当你在浏览器中没有敲最后的斜杠,django会先拿着你没有敲斜杠的结果去匹配,如果都没有匹配上,会让浏览器在末尾加斜杠再发一次请求再匹配一次,如果这次还匹配不上便会走404报错。也就是说匹配了两次。

  如果你想取消该机制,不想做二次匹配可以在settings配置文件中指定:

1 APPEND_SLASH = False  # 该参数默认是True

分组命名匹配

  在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。

无名分组

1 url(r'^test/([0-9]{4})/', views.test)

  路由匹配的时候,会将括号内正则表达式匹配到的内容,当做位置参数传递给视图函数。

test(request,2019)

有名分组

1 url(r'^test/(?P<year>\d+)/', views.test)

  路由匹配的时候,会将括号内正则表达式匹配到的内容,当做关键字参数传递给视图函数。如果你给正则起了个名字,那么这个正则匹配到的内容就会当做关键字参数传递给后面的视图函数。名字叫什么,那么视图函数里的形参就是什么。

  test(request,year=2019)

注意:无名分组与有名分组不能混合使用,但是在同一种分组下,可以使用多个。

1 # 无名分组支持多个
2 url(r'^test/(\d+)/(\d+)/', views.test),
3 
4 # 有名分组支持多个
5 url(r'^test/(?P<year>\d+)/(?P<xx>\d+)/', views.test),

反向解析

本质:其实就是给你返回一个能够返回对应url的地址

1.先给url和视图函数对应关系起别名

  url(r'^index/$',views.index,name='kkk')

2.反向解析

  后端反向解析

    后端可以在任意位置通过(reverse+别名)反向解析出对应的url

  from django.shortcuts import renderHttpResponseredirectreverse

  reverse('kkk')

  前端反向解析

    {% url 'kkk' %}   # kkk是随机定义的。

无名分组反向解析

同无名分组反向解析意义的用法
    url(r'^index/(?P<year>\d+)/$',views.index,name='kkk')

后端方向解析
  print(reverse('kkk',args=(1,))) # 推荐你使用上面这种 减少你的脑容量消耗
  print(reverse('kkk',kwargs={'year':1}))

前端反向解析
  <a href="{% url 'kkk' 1 %}">1</a> # 推荐你使用上面这种 减少你的

  <a href="{% url 'kkk' year=1 %}">1</a>

有名分组反向解析

同无名分组反向解析意义的用法
    url(r'^index/(?P<year>\d+)/$',views.index,name='kkk')

后端方向解析
  print(reverse('kkk',args=(1,))) # 推荐你使用上面这种 减少你的脑容量消耗
  print(reverse('kkk',kwargs={'year':1}))

前端反向解析
  <a href="{% url 'kkk' 1 %}">1</a> # 推荐你使用上面这种 减少你的
  <a href="{% url 'kkk' year=1 %}">1</a>

路由分发

  当你的django项目特别庞大的时候 路由与视图函数对应关系特别特别多,那么你的总路由urls.py代码太过冗长,不易维护。

  每一个应用都可以有自己的urls.py,static文件夹,templates文件夹,正是基于上述条件 可以实现多人分组开发 等多人开发完成之后 我们只需要创建一个空的django项目,然后将多人开发的app全部注册进来 在总路由实现一个路由分发 而不再做路由匹配(来了之后 我只给你分发到对应的app中)。

  当你的应用下的视图函数特别特别多的时候 你可以建一个views文件夹 里面根据功能的细分再建不同的py文件(******)

1 urlpatterns = [
2     url(r'^admin/', admin.site.urls),
3     url(r'^app01/',include('app01.urls')),
4     url(r'^app02/',include('app02.urls')),
5     ]

名称空间(了解)

  多个app起了相同的别名 这个时候用反向解析 并不会自动识别应用前缀,如果想避免这种问题的发生,有以下两种方式。

方式1:
总路由
url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))

后端解析的时候
reverse('app01:index')
reverse('app02:index')

前端解析的时候
{% url 'app01:index' %}
{% url 'app02:index' %}
方式2:
起别名的时候不要冲突即可 一般情况下在起别名的时候通常建议以应用名作为前缀
name = 'app01_index'
name = 'app02_index'

伪静态

  静态网页:数据是写死的,万年不变,伪静态网页的设计是为了增加百度等搜索引擎seo查询力度,所有的搜索引擎其实都是一个巨大的爬虫程序。网站优化相关,通过伪静态确实可以提高你的网站被查询出来的概率。

虚拟环境

  一般情况下 我们会给每一个项目,配备该项目所需要的模块,不需要的一概不装,虚拟环境 就类似于为每个项目量身定做的解释器环境。如何创建虚拟环境,每创建一个虚拟环境 就类似于你又下载了一个全新的python解释器

 

posted @ 2019-09-18 09:26  kuanglinfeng  阅读(126)  评论(0)    收藏  举报