一:url模块化
1:url为什么需要模块化
Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便
2:url模块化实现
- 在每个 app 目录里都创建一个 urls.py 文件
- 在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录
2.1:在app下新建urls.py文件
2.2:在项目名称目录项下的urls文件,统一做转发
```python from django.urls import path, include
‘’’ app urls,由项目urls转发而来 ‘’’ urlpatterns = [
#路由转发 在app下新建urls,在项目urls下进行路由转发,include中写AppName.urlspath('zhylbwg/',include("zhylbwg.urls")),
]
<a name="1uxB6"></a>### 2.3:在app的urls中导入视图并进行url-视图映射```pythonfrom django.urls import path, include# 导入视图至app urls中from zhylbwg.views import login'''app urls,由项目urls转发而来'''urlpatterns = [path("zhylbwg/login/", login.login),]
2.4:测试
二:url反向解析
1:url为什么需要反向解析
- 随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护
这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作
2:url反向解析实现
2.1:模板超链接
目录结构:

在app的urls中给路由起名别 name=’路由别名’ ```python from django.urls import path, include
from zhylbwg.views import login from zhylbwg.views import urlPratice ‘’’ app urls,由项目urls转发而来 ‘’’ urlpatterns = [ path(“zhylbwg/login/“, login.login), path(‘zhylbwg/register/‘, login.register),
# 名别路由path('getRegisterMessage/',urlPratice.reversePractice,name='getRegisterMess')
]
- 在views中定义返回前端的模板```pythonfrom django.shortcuts import render,HttpResponsedef reversePractice(request):return render(request,'master/register.html')
- 在模板 templates 中的 HTML 文件中,利用 {% url “路由别名” %} 反向解析。 ```html <!DOCTYPE html>
- 查看反向解析结果<a name="o4ssV"></a>### 2.2:视图重定向目录结构:- 在app的urls中给路由起名别 name='路由别名'```pythonfrom django.urls import path, includefrom zhylbwg.views import loginfrom zhylbwg.views import urlPratice'''app urls,由项目urls转发而来'''urlpatterns = [path("zhylbwg/login/", login.login),path('zhylbwg/register/', login.register),# 名别路由path('getRegisterMessage/',urlPratice.reversePractice,name='getRegisterMess'),# 视图重定向path('viewRedirect/',urlPratice.viewsRedirect)]
在 views.py 中,从 django.urls 中引入 reverse,利用 reverse(“路由别名”) 反向解析
# 引入HttpResponseRedirectfrom django.http import HttpResponseRedirectfrom django.shortcuts import render,HttpResponse# 引入reverse反向解析from django.urls import reversedef reversePractice(request):return render(request,'master/register.html')def viewsRedirect(request):# 使用HttpResponseRedirect进行重定向return HttpResponseRedirect(reverse('getRegisterMess'))
访问测试
输入地址:http://127.0.0.1:8090/zhylbwg/viewRedirect/ 会重定向到 地址:http://127.0.0.1:8090/zhylbwg/getRegisterMessage/
三:url命名空间
1:url为什么需要命名空间
路由别名 name 没有作用域,Django 在反向解析 URL 时,会在项目全局顺序搜索,当查找到第一个路由别名 name 指定 URL 时,立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误
2:url命名空间实现
定义一个命名空间在项目名称urls路径下
# 命名空间格式include(("appName:urls","命名空间名称"))
urlpatterns = [# 路由转发 在app下新建urls,在项目urls下进行路由转发并给定命名空间path(r'zhylbwg/',include(("zhylbwg.urls","zhylbwg"))),]
在 views.py 中,从 django.urls 中引入 reverse,利用 reverse(“命名空间名:路由别名”) 进行反向解析
from django.http import HttpResponseRedirectfrom django.shortcuts import render,HttpResponsefrom django.urls import reversedef viewsRedirect(request):return HttpResponseRedirect(reverse('zhylbwg:getRegisterMess'))
在模板 templates 中的 HTML 文件中,利用 {% url “命名空间名:路由别名” %} 反向解析
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>系统注册</title></head><body><form action="{% url 'zhylbwg:getRegisterMess' %}",method="POST"><p>用户类型:<input type="text",name="user_type"></p><p>用户名:<input type="text",name="userName"></p><p>用户密码:<input type="password",name="userPwd"></p><p>手机号码:<input type="text",name="userTelphone"></p><p>地址:<input type="text",name="userAddress"></p><p>年龄:<input type="text",name="userAge"></p><input type="submit",name="提交"></form></body></html>
访问测试
输入地址:http://127.0.0.1:8090/zhylbwg/viewRedirect/ 会重定向到 地址:http://127.0.0.1:8090/zhylbwg/getRegisterMessage/
四:url正则路径

django的urls中使用 re_path:用于正则路径,需要自己手动添加正则首位限制符号
from django.urls import path, re_pathfrom zhylbwg.views import loginurlpatterns = [# 正则匹配路径re_path(r"^login/id=?[0-6]{4}/$",login.login)]
定义视图 ```python import json from zhylbwg.models import loginModels from zhylbwg.views import md5 # 导入自定义md5加密函数 from zhylbwg.views import requestResult # 导入自定义的统一返回函数 from django.shortcuts import render, HttpResponse def login(request): if request.method == ‘POST’:
# 获取请求头数据,请求以json的格式传输loginInfor = request.bodyloginInformation = json.loads(loginInfor)# 获取用户名userName = loginInformation.get('userName')# 判断该用户名是否存在userNameDB = loginModels.Userinfo.objects.filter(userName=userName)print(userNameDB.values_list('userName')[0])if len(userNameDB) == 0:return HttpResponse(json.dumps(requestResult.result_json('202', '该用户名不存在,请注册', '')),content_type="application/json,charset=utf-8")else:'''判断密码是否正确'''# 得到前端传过来的密码userPwd = loginInformation.get('userPwd')# 使用mdb进行加密userPwdMd5 = md5.Md5(userPwd)# 根据同用户名从数据库中获取密码checkLogin = loginModels.Userinfo.objects.get(userName=userName)# 比较2个密码是否一致if userPwdMd5 == checkLogin.userPwd:# 若一致,则登录成功return HttpResponse(json.dumps(requestResult.result_json('203', '登录成功', '')),content_type="application/json,charset=utf-8")else:return HttpResponse(json.dumps(requestResult.result_json('504', '密码错误', '')),content_type="application/json,charset=utf-8")
```
- 测试

注意:基于正则的url反向解析及命名空间同样使用
