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/