Python - Django - 路由系统

URL 配置:

urls.py 中的基本配置:

from django.conf.urls import url
from app01 import views

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

在 Django 2 版本后将 url 改为 path

from django.urls import path
from app01 import views

urlpatterns = [
    path(正则表达式, views 视图函数[, 参数, 别名]),
]

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

 

正则表达式:

$:

如果在一个目录后加上 $,访问该目录后不存在的页面则会报错

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^test/', views.test),
]

访问一个不存在的页面

如果加上 $

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^test/$', views.test),
]

访问一个不存在的页面

报错

其它的正则表达式:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^test/[0-9]{2,4}/', views.test),  # test/ 目录后可以访问 2-4 位 0-9 的数字
]

访问:http://127.0.0.1:8000/test/1234/,返回正常

访问:http://127.0.0.1:8000/test/12345/,报 404

可以使用多个正则表达式

 

视图函数的参数:

一:

通过括号可以将正则表达式匹配到的结果作为视图函数的参数

urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^test/([0-9]{2,4})/([a-zA-Z]{2,4})/', views.test),
]

views.py:

from django.shortcuts import render

def test(request, arg1, arg2):
    print("arg1: ", arg1)
    print("arg2: ", arg2)
    return render(request, "test.html")

访问:http://127.0.0.1:8000/test/1234/acd/

该方法给视图函数传递的是位置参数

二:

还可以使用正则表达式匹配语法:

(?P<name>pattern)

其中 name 是组的名称,pattern 是要匹配的模式,注意这里是大写的 P

该方法传的参数是关键字参数

urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^test/(?P<id>[0-9]{2,4})/(?P<title>[a-zA-Z]{2,4})/', views.test),
]

views.py:

from django.shortcuts import render

def test(request, id, title):
    print("id: ", id)
    print("title: ", title)
    return render(request, "test.html")

访问:http://127.0.0.1:8000/test/1234/acd/

获取的 id 值为 1234,但是是字符类型

三:

可以在视图函数中指定默认值:

urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^blog/$', views.blog),
    url(r'^blog/page=(?P<num>[0-9]+)/$', views.blog)
]

views.py:

from django.shortcuts import render

def blog(request, num="1"):
    print("当前页面:", num)
    return render(request, "test.html")

访问:http://127.0.0.1:8000/blog/

访问:http://127.0.0.1:8000/blog/page=34/

 

四:

直接给视图函数传参数

urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^test/', views.test, {"username": "admin", "password": "123456"}),
]

views.py:

from django.shortcuts import render

def test(request, username, password):
    print("username: ", username)
    print("password: ", password)
    return render(request, "test.html")

访问:http://127.0.0.1:8000/test/

 

APPEND_SLASH 参数:

可在 settings.py 中添加 APPEND_SLASH 参数,该参数在 settings.py 中没有写出来,默认值为 True

APPEND_SLASH = True:

访问:http://127.0.0.1:8000/blog

会自动在 blog 后加个 /,即为访问 http://127.0.0.1:8000/blog/

APPEND_SLASH = False:

访问:http://127.0.0.1:8000/blog

不会自动在 blog 后加个 /,所以会报错

 

include 其他的 URL 配置:

在 app01/ 下创建一个 urls.py 文件

app01/urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^blog/', views.blog),
]

mysite2/urls.py:

from django.conf.urls import url, include
from app01 import views
from app01 import urls as app01_urls

urlpatterns = [
    url(r'^test/', include(app01_urls))
]

所有以 test/ 开头的 url 都交给 app01/urls.py 来处理

访问:http://127.0.0.1:8000/test/blog/

 

posted @ 2019-07-31 17:21  Sch01aR#  阅读(286)  评论(0编辑  收藏  举报