Django ---初探路由

 

路由

一个完整的路由包含:路由地址,视图函数(视图类),可选变量和路由命名

路由的定义规则

路由称为URL,是对可以从互联网上得到的资源位置和访问方法的一种简洁的表示,是互联网上标准资源的地址,互联网上的每个文件都有一个唯一的路由。用于指出网站文件得路径位置。简单的说路由可以视为我们常说的网站,每个网站代表不同的网页。

在项目中的APP里面创建一个urls.py。在APP里面添加urls.py是将属于APP的路由都写入该文件,这样更容易区分和管理每个APP的路由地址,而项目下的urls.py是将每个APP的urls.py统一管理

工作原理:

  1. 运行项目时,Django从项目中的urls.py里面找到各个APP所定义的路由信息,生成完整路由列表
  2. 当用户在浏览器上访问某个路由地址时,Django就会收到该用户的请求信息。
  3. Django从当前请求信息中或的路由地址,并在路由列表里面匹配相应的路由信息。在执行路由信息 所指向的视图函数,从而完成整个请求的响应过程。

Django ---初探路由_第1张图片

from django.contrib import admin    #导入内置Admin功能模块
from django.urls import path,re_path  
from index.views import index
from django.views.static import serve
from django.conf import settings
from django.urls import include   #导入Django的路由函数模块
urlpatterns = [
    path('admin/', admin.site.urls),   #指向内置Admin后台系统的路由文件sites.py
    path('',index),
    re_path('media/(?P.*)',serve,{'document_root':settings.MEDIA_ROOT},name='media'),
    path('',include('index.urls'))      #指向index的路由文件urls.py
]

项目文件夹的urls.py定义两条路由信息,分别是Admin站点管理首页地址其中,Admin站点管理在创建项目时已自动生成。一般情况其无需修改,首页地址是指index下的urls.py。

  • urlpatterns:代表整个项目的路由集合,以列表形式显示,每个元素代表一个路由信息。
  • path('admin/', admin.site.urls):设定Admin的路由信息,Admin代表127.0.0.1:8000/admin的路由地址,admin.site.urls指向内置Admin功能所自定义的路由信息。可以在python\Lib\site-packages\django\contrib\admin\sites.py找到定义过程
  • path('',include('index.urls'):路由地址为\ 即127.0.0.1:8000通常是网站的首页,路由函数include是将该路由信息分发给index的urls.py处理。

由于首页地址分发给了index下的urls.py处理,因此下一步的urls.py编写路由信息

from django.urls import path
from . import views
urlpatterns=[
    path('',views.index)
]

路由信息 path('',views.index) 的views.index是指视图函数index处理网站首页的用户请求和响应的过程

from django.shortcuts import render

# Create your views here.

def index(request):
    return render(request,'index.html')

index函数必须设置一个参数,参数名不固定,但常用request进行命名,代表当前用户的请求对象,该对象包含当前请求的用户名,请求内容和请求方式等。视图函数执行完成后必须要使用return返回结果,否则程序会报错。

项目启动时查找路由的的流程

ROOT_URLCONF = 'djangoProject.urls'  1  #启动项目的时候会读取这里的值    

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('',index),
    # re_path('media/(?P.*)',serve,{'document_root':settings.MEDIA_ROOT},name='media'),
    path('',include('index.urls'))
]   2
from django.urls import path
from . import views
urlpatterns=[
    path('',views.index)
] 3  #index 下的urls.py 指向了视图函数
from django.shortcuts import render

# Create your views here.

def index(request):
    return render(request,'index.html')   4   #处理请求和响应返回给用户

路由是由Django的path函数定义的,该函数的第一个参数是路由地址,第二个参数为路由所对应的视图函数,这两个参数是路由定义的必选参数。

路由的变量设置

路由的变量类型由字符类型,整形,slug和uuid,最为常用的就是字符和整形

  • 字符串型:匹配任意非空字符串,但不含斜杠,如果没有指定类型,就默认使用该类型。
  • 整形:匹配0和正整数
  • slug:可以理解为注释后缀或附属等概念,常作为路由的解释性字符,可匹配任意ASCLL字符以及连接符和下画线,能使路由更清晰易懂。
  • uuid:匹配一个uuid格式的对象,为了防止冲突,规定必须使用-,并且所有字母必须小写。
urlpatterns=[
    path('',views.index),
    path('//',views.myvariable)
]
  • year:变量名,数据格式为字符串
  • :变量名为month,数据格式为整形。
  • :变量名为day,数据格式为slug

def myvariable(request,year,month,day):
    return HttpResponse(str(year)+'/'+str(month)+'/'+str(day))

路由地址所设置的变量可以在视图函数里以参数的形式使用,视图函数将路由地址的变量值作为响应内容输出到网上。year,month,day 分别代表设置的变量year,,.路由的变量和参数要一一对应。如果路由的变量和视图函数的参数对应不上,就会报错

路由地址设置变量

Django ---初探路由_第2张图片

Django ---初探路由_第3张图片

  • 参数只能以字典的形式表示
  • 设置的参数只能在视图函数中读取和使用
  • 字典的一个键值对代表的一个参数,键值对的键代表着参数名,值代表参数值
  • 参数值没有数据格式的限制,可以为某个实列对象,字符串或列表元组

视图函数的参数要对应字典里面的键,如果字典里面设置两对以上的键值,视图函数就要设置对应的参数

正则表达式的路由定义

可以使用正则表达式来限制路由地址变量的取值范围

from django.urls import path,re_path
from . import views
urlpatterns=[
    path('',views.index,{'month':'2018/08/08'}),
    path('//',views.myvariable),
    re_path('?P[0-9]{4}/(?P[0-9]{2}/(?P[0-9]{2}).html',views.myvariable)
]

路由的正则表达式是由re_path来定义的,其作用就是对路由变量进行截取与判断,正则表达式是以小括号为单位的,每个小括号的前后可以使用斜杠或其他字符分割和结束。路由地址设置了html,这是一种伪静态URL技术,可将网址设置为静态网址。用来SEO搜索引擎的爬取,如百度,谷歌。在尾端设置html是为了给day变量设置终止符,尾端变量没有终止符html,在浏览器上输入无限长的字符串,路由也能正常访问。

  • ?P是固定格式,字母P必须是大写
  • 变量名
  • [0-9]{4}是正则表达式的匹配模式,代表变量的长度为4,只允许取0-9的值。

def myvariable(request,year,month,day):
    return HttpResponse(str(year)+'/'+str(month)+'/'+str(day))

 

命名空间和路由命名

网站的规模越来越大,其网页的内容就会越来越大,如果网站的内容过多,在管理和维护上面就会存在一定的难度,Django为了更好的管理和使用路由,可以为每条路由设置命名空间和路由名称

在项目中新建一个APP user,并在APP文件下创建一个urls.py文件,然后在配置文件APP里面添加user,是的Django会识别这个APP。然后在项目中的urls.py文件中添加路由信息,指向user文件下的urls.py

Django ---初探路由_第4张图片

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('',index),
    # re_path('media/(?P.*)',serve,{'document_root':settings.MEDIA_ROOT},name='media'),
    path('user/',include(('user.urls','user'),namespace='user')),
    path('',include('index.urls','index'))
]

在函数include里设置了可选参数namespace,该参数是函数include特有的参数,这就是Django的命名空间,路由函数include设由参数arg和namespace,arg指向了APP的urls.py文件,其数据格式以元组和字符串表示,若要对路由设置参数namespace,则参数arg必须以元组格式表示,并且元组的长度必须为2.一般情况下是以项目应用的名称进行命名

路由命名name

from django.urls import path
from . import views
urlpatterns=[
    path('login',views.userLogin,name='userLogin')
]

如果路由里使用路由函数include,就可以对该路由设置参数name,因为路由的命名空间namespace是路由函数的include的可选参数,而路由名name是路由path或re_path的可选参数,两种属于不同的路由参数,因此可以在同一路由里面共存,一般情况下,使用路由函数include就没有必要在对路由设置参数name,尽管设置了name,但实际开发中没有实际的作用。其作用是在开发中可以在视图函数或模板等其他功能模块使用路由命名name来生成路由地址

模板中使用路由

#项目中的urls
urlpatterns=[
    # path('',views.index,{'month':'2018/08/08'}),
    path('//',views.myvariable,name='mydate'),
    path('',views.index)
    # re_path('(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2}).html',views.myvariable)
]
#项目应用中的urls
urlpatterns=[
    # path('',views.index,{'month':'2018/08/08'}),
    path('//',views.myvariable,name='mydate'),
    path('',views.index)
    # re_path('(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2}).html',views.myvariable)
]
#视图函数
def index(request):
    return render(request,'index.html')
    # return HttpResponse('这是路由地址之外的变量:'+month)

def myvariable(request,year,month,day):
    return HttpResponse(str(year)+'/'+str(month)+'/'+str(day))



    
    Django



    hello ptthon


查看日期 #要传递给项目应用urls 里面name

模板语法url的参数设置路由定义是相互关联的

  • 若路由地址存在变量,则模板语法url需要设置相应的参数值,参数值之间使用空格隔开
  • 若路由地址不存在变量,则模板语法url只需要设置路由命名name的值即可,无需设置额外的参数
  • 路由地址的变量和模板的参数数量不同,则在浏览器访问会报错。

month设置的变量与模板语法的额参数01是不同类型的。这种写法是允许的,因为Django在运行的时候,会自动将模板的参数 值转换成路由地址变量设置的数据类型

上述没有在项目urls种设置命名空间,设置了命名空间模板的语法也要轻微改变。

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('',index),
    path('',include('index.urls')),
    # re_path('media/(?P.*)',serve,{'document_root':settings.MEDIA_ROOT},name='media'),
    path('', include(('index.urls', 'index'), namespace='index'))
    # path('user/',include(('indexsw.urls', 'indexsw'), namespace='indexsw')),
    # path('',include(('index.urls', 'index'), namespace='index'))
]


    hello ptthon


查看日期

在设置了命名空间,需要在模板命名路由name前面添加命名空间namespace并且使用冒号隔开。

 

反向解析reverse和resolve

Django根据网址在路由列表里面查找相应的路由,在从路由里找视图函数或者视图类进行处理,将处理的结果作为响应内容返回浏览器并生成网页内容,这个生命周期是不可逆的,而在视图里使用路由这一过程被称为反向解析。

Django的反向解析主要由函数reverse和resolve实现,函数reverse主要是通过路由命名或可调用视图对象来生成路由地址的,函数resolve是通过路由地址来获取路由对象信息的

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('',index),
    # path('',include('index.urls')),
    # re_path('media/(?P.*)',serve,{'document_root':settings.MEDIA_ROOT},name='media'),
    path('', include(('index.urls', 'index'), namespace='index'))
    # path('user/',include(('indexsw.urls', 'indexsw'), namespace='indexsw')),
    # path('',include(('index.urls', 'index'), namespace='index'))
]
urlpatterns=[
    # path('',views.index,{'month':'2018/08/08'}),
    path('//',views.myvariable,name='mydate'),
    path('',views.index,name='index')
    # re_path('(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2}).html',views.myvariable)
]
from django.shortcuts import render
from django.http import  HttpResponse
from django.urls import resolve
from django.shortcuts import  reverse
# Create your views here.

def mydate(request,year,month,day):
    asgs=['2019','12','12']
    result=resolve(reverse('index:mydate',args=asgs))
    print('kwargs',result.kwargs)   #以字典形式获取路由的变量信息
    print('url_name',result.url_name)  #路由的名字
    print('app_name',result.app_names)   #获取命名空间里面的第二个参数
    print('app_name',result.app_name)
    return HttpResponse(str(year) + '/' + str(month) + '/' + str(day))


def index(request):
    kwargs={'year':2010,'month':2 ,'day':10}
    args=['2019','01','12']
    print(reverse('index:mydate',args=args))
    print(reverse('index:mydate',kwargs=kwargs))
    return HttpResponse(reverse('index:mydate',args=args))

reverse(viewname,urlconf=None,args=None,Kwargs=None,curent_app=None)函数的的参数

  • viewname:代表路由命名或可调视图对象,一般情况下以路由命名name来生成路由地址的。
  • urlconf:设置反向解析的URLconf模块
  • args:以列表形式向路由地址传递变量,列表元素与地址变量和数量一一对应
  • kwargs:以字典形式向路由地址传递变量,字典的键必须对应变量的名,字典的键值与变量的数量要一样
  • curent_app:提示当前正在执行的视图所在的项目应用,主要起提示作用

Django ---初探路由_第5张图片

在Django里面所有路径都是以相对路径表示,,斜杠代表127.0.0.1:8000 域名

resolve(path,urlconf=None)函数的参数

  • path:代表路由地址,通过路由地址来获取路由对象的信息。
  • urlconf:设置反向解析的URLconf模块

 

你可能感兴趣的:(Django,django)