Django 路由配置(二)
一、路由
就是根据用户请求的URL链接来判断对应的出来程序,并返回处理结果,也是就是URL和django的视图建立映射关系.
二、Django请求页面的步骤
1、首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF
来设置,在settings.py
配置文件中。但是如果传入 HttpRequest
对象具有urlconf
属性(由中间件设置),则其值将用于替换ROOT_URLCONF设置
2、 Django加载该Python模块并查找该变量 urlpatterns
。它是django.urls.path()
和(或)django.urls.re_path()
实例的序列(sequence)。urlpatterns表示路由模型,通过路由模型寻找里面具体的地址
3、Django按顺序运行每个URL模式,并在匹配所请求的URL的第一个URL中停止。
4、一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。该视图会获得如下参数:
- 一个
HttpRequest
实例。- 如果匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将作为位置参数提供。
- 关键字参数由正则表达式匹配的任何命名组组成,由可选kwargs参数中指定的任何参数覆盖。
django.urls.path\(\)
、django.urls.re_path\(\)
5、如果没有正则表达式匹配,或者在此过程中的任何一点出现异常,Django将调用适当的错误处理视图
三、urls中path参数说明
https://docs.djangoproject.com/en/4.2/topics/http/urls/
(1)系统已经配置好一个路由,这个路由访问就是django自带的后端管理系统
启动项目 python manage.py runserver
通过地址加路由的admin去访问http://127.0.0.1:8000/admin/login/?next=/admin/
(2) 设置自己的页面路由
2.1 编写视图函数
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
# 视图函数
def info(request):
#响应数据
return HttpResponse('HelloWorld~~~~')
2.2 在urls中配置路径
from django.contrib import admin
from django.urls import path,include #导包include
from user.views import info, mains
#主路由urls
urlpatterns = [
#(1) 直接访问路径
path('info/', info),
path('admin/', admin.site.urls),
]
2.3 启动,访问http://127.0.0.1:8000/info/
四、路由分发
为了方便管理项目,一般会在对应的项目里面添加一个urls的子路由文件,要让系统识别子路由,需要导入方法:include(也被称为路由分发)
原因: django项目中多个app目录共用一个url容易造成混淆,后期维护也不方便
解决:使用路由分发,让每个app目录都单独拥有自己的urls
步骤:
1.在每个app目录都创建一个urls.py的文件(拷贝主路由urls.py进行修改!)
2.在视图veiws.py文件编写视图函数
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
# 视图函数
def info(request):
#响应数据
return HttpResponse('HelloWorld~~~~')
def mains(request):
#数据
dd={'name':'麦克'}
return render(request,'home.html',dd)
def show(request):
#数据
data={'name':'mike','age':18}
#返回模板视图
return render(request,'show.html',{'data':data})
3.在urls导入app目录下的views.py文件
from django.urls import path
#导入视图
from user.views import info,mains,show
#如果shows页面可能有多个,那么需要用到命名空间。
# app_name="user"
#子路由urls
urlpatterns = [
#path(路由访问路径,视图名称)
path('info/', info),
path('mains/', mains),
path('show/', show),
# path(路由访问路径,视图名称,别名)
path('show/', show,name='shows'),
]
4. 模板页面 home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>渲染视图</title>
</head>
<body>
<h1>欢迎您<span style="color:royalblue">【{{ name }}】</span> 来到!!
<a href="/user/show/">第二页</a></h1>
{# 使用别名来替代硬编码 #}
<a href="{% url 'shows' %}">使用别名</a><p/>
{# 使用命名空间+别名来替代硬编码 #}
{#<a href="{% url 'user:shows' %}">使用命名空间+别名</a><p/>#}
</body>
</html>
show.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>渲染视图</title>
</head>
<body>
<h1> hello ! {{ data }}</h1>
</body>
</html>
5.在主路由配置子路由
from django.contrib import admin
from django.urls import path,include #导包include
from user.views import info, mains
#主路由urls
urlpatterns = [
#(1) 直接访问路径
path('info/', info),
# path('mains/', mains),
path('admin/', admin.site.urls),
#(2)使用子路由来访问
#一个应用对应一个子路由
path('user/',include('user.urls'))
]
6.启动项目:http://127.0.0.1:8000/
http://127.0.0.1:8000/user/mains/
点击第二页 或 单击使用别名
五、问题:如果shows页面可能有多个,那么需要用到命名空间。
(1)在子路由,进行定义命名空间
(2)在home.html页面中使用
<a href="{% url 'user:shows' %}">使用命名空间+别名</a>
(3) 访问:http://127.0.0.1:8000/user/mains/
单击超链接