Django 创建子应用、目录结构、路由分发

创建项目

  • 创建项目
    diango-admin startproject my_project/项目名称
    
  • 创建子应用
    python3 manage.py startapp app01/子应用名称
    

目录结构

  • 目录介绍
     │─ manage.py    # 终端脚本命令,提供了一系列用于生成文件或者目录的命令,也叫脚手架
     └─ my_project/        # 主应用开发目录,创建项目时自动创建
        │- asgi.py      # django3.0以后新增,用于异步处理
        │- settings.py  # 默认配置文件
        │- urls.py      # 用于绑定视图和URL的映射关系,路由列表
        │- wsgi.py      
        └- __init__.py
    └─ app01         # 子应用
        │- models    # 用于数据库操作
        │- views     # 视图
        │- tests     # 单元测试模块
        │- apps      # 子应用的一些配置,自动生成
        │- admin.py  # 应用的后台管理系统配置
    
    

路由分发

path("index/",index), # 当路径也就是path的第一个参数,如果后面没有/请求的时候加/就会报错找不到该路径,如果路径后面加/请求的时候没有加/这个时候Django会做一个重定向处理 重定向的时候自动加上/,不会报错 , 配置文件加上APPEND_SLASH = False 将不会在自动补/,就会报错

  • 第一种映射绑定
    from django.urls import path
    from app01.views import timer # 导入视图函数
    
    urlpatterns = [
            path("timer/",timer),# 绑定视图函数
            # 多对一,一对多不允许
            path("index/",index),
            path("index2/",index),
    ]
    
  • 路由分发
    • 全局urls.py
      from django.urls import path,include
      
      urlpatterns = [
          path("app01/",include("app01.urls")) # 使用include指向子应用的urls.py,默认子应用没有urls.py文件,创建一个即可
      ]
      
    • 子应用的urls.py
      from django.urls import path
      from app01.views import timer
      
      urlpatterns = [
          path("timer/",timer), # 在子应用的urls.py里面正常绑定就行 ,访问的时候加上app01,如: http://ip:port/app01/timer
      ]
      

路由分组

  • URL绑定
    from django.urls import path,re_path #导入re_path
    
    urlpatterns = [
        re_path("articles/(\d{4})/(\d{2})",article_archive), # re_path是可以使用正则匹配,将上括号代表实参传给视图函数,
                                                                             # 也就是说第一个括号匹配出来的内容作为article_archive视图函数的的第一个参数,
                                                                             # 第二个括号匹配出来的内容作为article_archive视图函数的的第二个参数,
                                                                             # 位子传参
    ]
    
  • 视图函数
      def article_archive(request,year,month): # year接收路由第一个()匹配的内容,month接收路由里面的第二个括号匹配出来的内容, 位子传参
          return HttpResponse(f"{year}年{month}月")
    

有名分组

  • URL绑定
    from django.urls import path,re_path #导入re_path
    
    urlpatterns = [
        re_path("articles/(?P<year>\d{4})/(?P<month>\d{1,2})",article_archive),  # 按照关键字传参
    ]
    
  • 视图函数
      def article_archive(request,year,month): # year接收路由year匹配的内容,month接收路由里面的month匹配出来的内容,关键字传参
          return HttpResponse(f"{year}年{month}月")
    

反响解析

反向解析就是在使用path绑定路由的时候给一个name,路由在很多地方用到,一旦在path里面将绑定路径修改后 用到的地方都要修改 添加name后在调用统一用给定的name调用不在受路径修改的影响,正常情况下都是根据路由去找视图,反向解析是根据name去找路由

  • 模版应用反向解析

    • 模版

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
      
        <a href="{% url 'ord' %}">red</a> #使用 {% url 'ord' %} 做反向解析,url 是模版的内置标签
        </body>
        </html>
      
    • 路由绑定

        from django.urls import path
        from app01.views import index,order
      
        urlpatterns = [
            path('order/', order,name='ord'), # 给定一个 name 做反向解析用
            path('index/', index),
        ]
      
  • 视图应用反向解析

    • 视图
        def login(request):
            path = reverse("ord") # 先获取新的路由 ord对应的路由
            return redirect(path) # 重定向
      
  • 路由绑定
    ```
    from django.urls import path
    from app01.views import index,order

      urlpatterns = [
          path('order/', order,name='ord'), # 给定一个 name 做反向解析用
          path('index/', index),
      ]
    ```
    
posted @ 2022-11-25 09:19  zhq9  阅读(192)  评论(0编辑  收藏  举报