一:url模块化

1:url为什么需要模块化

Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便

2:url模块化实现

  • 在每个 app 目录里都创建一个 urls.py 文件
  • 在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录

    2.1:在app下新建urls.py文件

    图片.png

    2.2:在项目名称目录项下的urls文件,统一做转发

    ```python from django.urls import path, include

‘’’ app urls,由项目urls转发而来 ‘’’ urlpatterns = [

  1. #路由转发 在app下新建urls,在项目urls下进行路由转发,include中写AppName.urls
  2. path('zhylbwg/',include("zhylbwg.urls")),

]

  1. <a name="1uxB6"></a>
  2. ### 2.3:在app的urls中导入视图并进行url-视图映射
  3. ```python
  4. from django.urls import path, include
  5. # 导入视图至app urls中
  6. from zhylbwg.views import login
  7. '''
  8. app urls,由项目urls转发而来
  9. '''
  10. urlpatterns = [
  11. path("zhylbwg/login/", login.login),
  12. ]

2.4:测试

图片.png

二:url反向解析

1:url为什么需要反向解析

  • 随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护
  • 这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作

    2:url反向解析实现

    反向解析一般用在模板中的超链接及视图中的重定向

    2.1:模板超链接

    目录结构:
    图片.png

  • 在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),

  1. # 名别路由
  2. path('getRegisterMessage/',urlPratice.reversePractice,name='getRegisterMess')

]

  1. - views中定义返回前端的模板
  2. ```python
  3. from django.shortcuts import render,HttpResponse
  4. def reversePractice(request):
  5. return render(request,'master/register.html')
  • 在模板 templates 中的 HTML 文件中,利用 {% url “路由别名” %} 反向解析。 ```html <!DOCTYPE html>

    用户类型:

    用户名:

    用户密码:

    手机号码:

    地址:

    年龄:

  1. - 查看反向解析结果
  2. ![图片.png](https://cdn.nlark.com/yuque/0/2020/png/662776/1595904232078-f3926391-ef93-4ee0-aa38-2124c3e2a140.png#align=left&display=inline&height=387&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=774&originWidth=1227&size=37572&status=done&style=none&width=613.5)
  3. <a name="o4ssV"></a>
  4. ### 2.2:视图重定向
  5. 目录结构:
  6. ![](https://cdn.nlark.com/yuque/0/2020/png/662776/1595904313683-38779dbd-94b8-4ba8-9b24-9dfed709ae49.png#align=left&display=inline&height=384&margin=%5Bobject%20Object%5D&originHeight=770&originWidth=563&status=done&style=none&width=281)
  7. - appurls中给路由起名别 name='路由别名'
  8. ```python
  9. from django.urls import path, include
  10. from zhylbwg.views import login
  11. from zhylbwg.views import urlPratice
  12. '''
  13. app urls,由项目urls转发而来
  14. '''
  15. urlpatterns = [
  16. path("zhylbwg/login/", login.login),
  17. path('zhylbwg/register/', login.register),
  18. # 名别路由
  19. path('getRegisterMessage/',urlPratice.reversePractice,name='getRegisterMess'),
  20. # 视图重定向
  21. path('viewRedirect/',urlPratice.viewsRedirect)
  22. ]
  • 在 views.py 中,从 django.urls 中引入 reverse,利用 reverse(“路由别名”) 反向解析

    1. # 引入HttpResponseRedirect
    2. from django.http import HttpResponseRedirect
    3. from django.shortcuts import render,HttpResponse
    4. # 引入reverse反向解析
    5. from django.urls import reverse
    6. def reversePractice(request):
    7. return render(request,'master/register.html')
    8. def viewsRedirect(request):
    9. # 使用HttpResponseRedirect进行重定向
    10. return HttpResponseRedirect(reverse('getRegisterMess'))
  • 访问测试

输入地址:http://127.0.0.1:8090/zhylbwg/viewRedirect/ 会重定向到 地址:http://127.0.0.1:8090/zhylbwg/getRegisterMessage/
图片.png

三:url命名空间

1:url为什么需要命名空间

路由别名 name 没有作用域,Django 在反向解析 URL 时,会在项目全局顺序搜索,当查找到第一个路由别名 name 指定 URL 时,立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误

2:url命名空间实现

  • 定义一个命名空间在项目名称urls路径下

    1. # 命名空间格式
    2. include(("appName:urls""命名空间名称"))
    1. urlpatterns = [
    2. # 路由转发 在app下新建urls,在项目urls下进行路由转发并给定命名空间
    3. path(r'zhylbwg/',include(("zhylbwg.urls","zhylbwg"))),
    4. ]
  • 在 views.py 中,从 django.urls 中引入 reverse,利用 reverse(“命名空间名:路由别名”) 进行反向解析

    1. from django.http import HttpResponseRedirect
    2. from django.shortcuts import render,HttpResponse
    3. from django.urls import reverse
    4. def viewsRedirect(request):
    5. return HttpResponseRedirect(reverse('zhylbwg:getRegisterMess'))
  • 在模板 templates 中的 HTML 文件中,利用 {% url “命名空间名:路由别名” %} 反向解析

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>系统注册</title>
    6. </head>
    7. <body>
    8. <form action="{% url 'zhylbwg:getRegisterMess' %}",method="POST">
    9. <p>用户类型:<input type="text",name="user_type"></p>
    10. <p>用户名:<input type="text",name="userName"></p>
    11. <p>用户密码:<input type="password",name="userPwd"></p>
    12. <p>手机号码:<input type="text",name="userTelphone"></p>
    13. <p>地址:<input type="text",name="userAddress"></p>
    14. <p>年龄:<input type="text",name="userAge"></p>
    15. <input type="submit",name="提交">
    16. </form>
    17. </body>
    18. </html>
  • 访问测试

输入地址:http://127.0.0.1:8090/zhylbwg/viewRedirect/ 会重定向到 地址:http://127.0.0.1:8090/zhylbwg/getRegisterMessage/
图片.png

四:url正则路径

image.png

  • django的urls中使用 re_path:用于正则路径,需要自己手动添加正则首位限制符号

    1. from django.urls import path, re_path
    2. from zhylbwg.views import login
    3. urlpatterns = [
    4. # 正则匹配路径
    5. re_path(r"^login/id=?[0-6]{4}/$",login.login)
    6. ]
  • 定义视图 ```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’:

    1. # 获取请求头数据,请求以json的格式传输
    2. loginInfor = request.body
    3. loginInformation = json.loads(loginInfor)
    4. # 获取用户名
    5. userName = loginInformation.get('userName')
    6. # 判断该用户名是否存在
    7. userNameDB = loginModels.Userinfo.objects.filter(userName=userName)
    8. print(userNameDB.values_list('userName')[0])
    9. if len(userNameDB) == 0:
    10. return HttpResponse(json.dumps(requestResult.result_json('202', '该用户名不存在,请注册', '')),
    11. content_type="application/json,charset=utf-8")
    12. else:
    13. '''
    14. 判断密码是否正确
    15. '''
    16. # 得到前端传过来的密码
    17. userPwd = loginInformation.get('userPwd')
    18. # 使用mdb进行加密
    19. userPwdMd5 = md5.Md5(userPwd)
    20. # 根据同用户名从数据库中获取密码
    21. checkLogin = loginModels.Userinfo.objects.get(userName=userName)
    22. # 比较2个密码是否一致
    23. if userPwdMd5 == checkLogin.userPwd:
    24. # 若一致,则登录成功
    25. return HttpResponse(json.dumps(requestResult.result_json('203', '登录成功', '')),
    26. content_type="application/json,charset=utf-8")
    27. else:
    28. return HttpResponse(json.dumps(requestResult.result_json('504', '密码错误', '')),
    29. content_type="application/json,charset=utf-8")

```

  • 测试

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