Django_学习_02
-
路由系统 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_path
from 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对应的子路由路径
]