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 ]
- 全局urls.py
路由分组
- 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,orderurlpatterns = [ path('order/', order,name='ord'), # 给定一个 name 做反向解析用 path('index/', index), ] ```