一、django URL 简介

django中的路由系统,使用urls中的urlpatterns进行配置,

urlpatterns = [

         url(正则表达式, views视图函数,参数,别名),

]

参数说明:

    一个正则表达式字符串

    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

    可选的要传递给视图函数的默认参数(字典形式)

 一个可选的name参数

它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

二、注意事项及分组

django2.0以前的版本,使用的是url,而2.0版本开始,使用path和re_path方法路由:

path字符串直接路由,和re_path正则匹配路由,都将request对象作为第一个参数传递给视图views,

另外,re_path需要注意:

1、正则表达式最好以^开始、/$结束,结尾/是必须的,因为客户端URL传递至服务器端匹配前,会自动添加/表示正则内容结束,

2、正则表达式前的r字符是可选的,表示不对其中的内容进行转义,建议添加,

3、正则中用()分组,()包含起来的部分作为参数传递给views,需要注意接收(接收到的是字符串类型),可同时传递多个分组内容,

4、除了()直接简单分组,还可以使用(?P<name>****)进行命名分组,捕获的值作为关键字参数而不是位置参数传递给视图函数,

from django.contrib import admin
from django.urls import path,re_path

from app01 import views

urlpatterns = [
    # 默认路由
    path('admin/', admin.site.urls),

    # 自定义路由
    path('index', views.index),

    re_path('^articles/[0-9]{4}/$', views.year_archive),

    re_path('^articles/[0-9]{4}/([0-9]{2})/$', views.month_archive),

    re_path('^articles/[0-9]{4}/([0-9]{2})/([0-9]+)/$', views.date_archive),

    re_path('^articles/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$', views.date_detail),

]
urls
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index(request):
    print(request.method)
    return HttpResponse('最简单的路由:非正则匹配,request对象作为第一个参数')

def year_archive(request):
    print(request.method)
    return HttpResponse('正则匹配:需以/结尾,客户端url在匹配前会自动添加/表示正则结束,')


def month_archive(request,month):
    print(request.method)
    print(month)
    return HttpResponse('正则简单分组:其中以()包含起来的部分作为参数传递给视图,需要接收')

def date_archive(request,month,day):
    print(request.method)
    print(month)
    print(day)
    return HttpResponse(month+day)  # 简单分组按顺序匹配传递的参数

def date_detail(request,day,month):
    print(request.method)
    print(month)
    print(day)
    return HttpResponse(month+day)  # 命名分组根据指定名称匹配参数
Views

三、路由分发

django的一个项目中,通常有多个应用app,不同的app彼此解耦,

项目较大时,可以将不同应用app的路由统一至应用中分发,即使用二级路由,

具体实现方式如下:

1、在项目urls中导入include方法,使用include方法将不同正则表达式对应的路由,分发至相应的应用,

    re_path(r'^blog/',include('app01.urls')),

2、在各应用中新建urls.py文件,导入本应用的views,并指定具体路径:

re_path('name',views.name),

3、在本应用的views中,实现方法并使用

# app02.views
from django.http import HttpResponse
from django.shortcuts import redirect

def key(request,user):
    print(request.method)
    return HttpResponse(user)

def value(request):
    print(request.method)
    return redirect('/index')

# app01.views
from django.shortcuts import render,render_to_response

def index(request):
    print(request.method)
    return render(request,'index.html')  # 支持csrf的处理,避免跨站请求伪造,下面render_to_response不行

def name(request):
    name = 'lucy'
    return render_to_response('name.html',locals())  # locals()将本函数内的所有变量提供给模板语言使用
app views

4、可以127.0.0.1:8000/blog/name的方式访问