创建子应用
定义
- 将工程项目拆分为不同的子功能模块
– 以子应用的形式存在 - 各功能模块间可以保持相对的独立
- 可以将该模块代码整体复制过去
创建
方式一
使用命令行创建,python manage.py startapp 子应用名 路径
。路径一般不加,默认创建到当前根目录下。
方式二
点击Tools,选择run manage.py Task。在下面输入‘startapp 子应用名’即可创建子应用。
意义
- 将各功能模块保持独立(解耦)
- 方便各功能模块进行重用
子应用目录结构
projects/ 用于存放子应用的所有信息
migrations/ 用于存放数据库迁移脚本
admin.py 用于存放后台管理站点的相关配置
apps.py 用于存放app的配置信息
models.py 用于存放ORM数据库模型
tests.py 用于对当前子应用进行单元测试
views.py 用于定义业务逻辑
注册子应用
打开setting.py文件,有一个名为‘INSTALLED_APPS’的列表,就是用来存放子应用的。
将刚创建的子应用名称加到列表中。也可以添加‘子应用名.apps.子应用名首字母大写Config’,比较长,不推荐这种写法。
路由
路由就是url与后端视图之间的映射条目
新建路由
在子应用的view.py中写业务逻辑。
打开主文件夹中的urls.py文件,此文件存放全局路由信息,在列表urlpatterns中添加路由,此列表是存放路由条目的。
重启项目,在浏览器地址中输入http://127.0.0.1:8000/projects/就能访问到了。
路由匹配规则
- urlpatterns列表中从上到下进行匹配
- 如果匹配不成功,那么会往下匹配
- 如果当前路由匹配成功,会自动调用path函数第二个参数的函数
- 一旦路由匹配成功,那么不会继续往下匹配
- 如果所有的路由都匹配不成功,会抛出404异常(返回404页面)
路径参数
如果想要实现在url路径中放参数,就要用到路径参数。可以在定义路由条目时,接收路径参数。
格式:<类型转化器:参数名称>
修改项目url.py文件中的路由信息:
urlpatterns = [
...
path('projects/<int:pk>/', index),
...
]
<int:pk>
就是一个路由参数,指定了参数的类型是int,参数名称是pk。此时需要注意,传了pk参数,那么这条路由后的index方法就要接收pk参数,我们再去修改views.py文件中的index方法。
def index(request, pk):
return HttpResponse(f'Hello, 这是一个测试Dome!{pk}')
此处可以设置的类型有:int、str、slug、uuid等
- int和str就不解释了。
- slug:值有效的url的一部分,能使url更清晰易懂。比如有一篇文章是“13岁的孩子”,他的url地址是“/post/13_child”,后面的13_child就是slug。
- uuid:全球唯一标识符,是由算法产生的128位标识符。例如:a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
正则匹配路由
可以使用re_path来定义路由条目。
- 支持正则表达式
- 固定形式
r'^路径或者正则表达式/$'
urlpatterns = [
...
re_path(r'^requests/(?P<pk>\d{2})/$', do_request),# 匹配‘requests/’后加两位整数
]
子路由
如果所有路由信息都放在主路由中,那主路由的列表会变得很庞大,不便维护和管理。所以我们就在子应用中创建子路由。在主路由中匹配url的第一部分,在子路由匹配后面的部分。
在子应用中创建urls.py文件,这就是子路由。子路由的匹配方式与主路由一致。
子路由:
from django.urls import path
from .views import index # 以相对路径导入views
urlpatterns = [
path('project/', index),
]
子路由写好后,还需在主路由中关联。关联格式:include(‘子应用名.urls’)
from django.urls import include
urlpatterns = [
path('projects/', include('projects.urls')),
]
此时,输入url‘ip:端口/projects/project/’就会执行子应用的index方法。
需要注意的是,一旦进入到子路由中匹配,未找到匹配项,会报404异常,不会再到主路由继续匹配。