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/


浙公网安备 33010602011771号