-  路由系统 urls 
-  视图 views 
-  模板 TempLates 
-  静态文件和媒体文件 static 
-  中间件 middleware 
-  ORM databases 
1.路由系统
a.传统路由
urls 内容如下:
from django.urls import path
from app01 import views
urlpatterns = [# path('admin/', admin.site.urls),path('login/', views.login),path('article',views.article),path('inOne/<int:nid>/',views.inOne),path('abc/<str:a>/',views.abc)path('efg/<slug:b>/',views.efg),path('hij/<path:c>',views.hij),views 内容如下:
from django.shortcuts import render,HttpResponse# Create your views here.
def login(request):print('login')return HttpResponse('login')def article(request):return HttpResponse('article')def inOne(request,nid):print(nid)return HttpResponse('nid'+'inOne')def abc(request,a):print(a)return HttpResponse('abc')def efg(request,b):print(b)return HttpResponse('efg')
def hij(request,c):print(c)return HttpResponse('hij')传统路由总结如下
格式是<类型:参数> 且这个方式是可以传递参数到函数及views里面
-  int,整数 #匹配整数 格式 < 数据类型 : 数据 > 
-  str,字符串 #匹配字符串 
-  slug,字母+数字+下滑线+- # 匹配 字母+数字+下划线 + -号等 
-  uuid,uuid格式 
-  path,路径,可以包含 / 
b.正则表达式路由
urls 内容如下:
from django.urls import path,re_pathfrom app01 import views# 正则路由
urlpatterns = [re_path(r'aaa/(\d+)/',views.aaa),re_path(r'bbb/(\w+)-(\d*)/',views.bbb), # 这样写就是按分组位置传参,views函数中形参随意定义re_path(r'ccc/(?P<s1>\w+)/(?P<s2>\d+)/',views.ccc), # s1,s2就是参数名称,views函数中参数必须定义为s1,s2]views 内容如下:
from django.shortcuts import render,HttpResponse# 正则路由
def aaa(request,d):print(d)return HttpResponse('正则-aaa')def bbb(request,e,f):  #e,f 按位置来结束url过来的参数,可以任意定义这两个形参print(e)print(f)return HttpResponse('正则-bbb')def ccc(request,s1,s2):  #s1,s2是url固定带过来的必须定义为s1,s2 必须和urls中对应,可以理解成字典print(s1)print(s2)return HttpResponse('正则-ccc')- 正则需要导入re_path
- 需要在路径哪里前面加个r 如 r'aaa/(\w+)'
- 这里必须用括号分组
- 有多少个分组,views 中的对应的函数就需要多少个参数来对应 是和分组对应的
- 有两种书写方式,这两个方式可以借助python的 args 和 kwargs 来理解 俗称一个不带名字一个带名字
路由分发
假如一个项目中有很多个功能,可以分到多个app中,
inlucde + 多apps(一般),将功能拆分不到不同的app中。在每个app中创建每个app自己的路由(urls)。例如有两个app分别是 api web 格式如下:
from django.urls import path,include
urlpatterns = [path('api/',include('apps.api.urls')),  # api 是app目录且后面必须加/ ,include后面是app对应的子路由路径path('web/',include('apps.web.urls')),  # web 是app目录且后面必须加/ ,include后面是app对应的子路由路径]