-
路由系统 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对应的子路由路径]