创建App
我们可以直接在
HelloWorld
中添加各种文件,但是这会使得项目变得冗杂而不便于管理。我们一般会将不同的功能分成不同的App开发
创建一个名为
MyApp
的App
> python manage.py startapp MyApp
此时目录结构为
C:.│ db.sqlite3│ manage.py│├─HelloWorld│ │ asgi.py│ │ settings.py│ │ urls.py│ │ wsgi.py│ │ __init__.py│ ││ └─__pycache__│ settings.cpython-37.pyc│ urls.cpython-37.pyc│ wsgi.cpython-37.pyc│ __init__.cpython-37.pyc│└─MyApp│ admin.py│ apps.py│ models.py│ tests.py│ views.py│ __init__.py│└─migrations__init__.py
在创建
MyApp
时,自动生成了一系列文件
- init.py 包
- admin.py 管理后台
- apps.py
- migrations
- init.py 迁移
- model.py 模型
- test.py 测试
- view.py 视图
之后我们需要在
HelloWorld\\setting.py
中进行配置,在列表
INSTALLED_APPS
中加入
MyApp
路由设置
路由文件
路由中主要包括一个
urlpatterns
列表,每一个元素都以
path()
函数的形式存在
导入视图
在
path()
接收视图参数前,必须先导入视图,格式为
from view_path import view
path()
函数
在使用
path()
函数之前,必须先从
django.urls
中导入
path()
可以接收四个参数,分别是两个必选参数:
route
、
view
和两个可选参数:
kwargs
、
name
。
path(route, view, kwargs=None, name=None)
- route: 字符串,表示 URL 规则,与之匹配的 URL 会执行对应的第二个参数 view。
- view: 用于执行与正则表达式匹配的 URL 请求。
- kwargs: 视图使用的字典类型的参数。
- name: 用来反向获取 URL。
include()
函数
include()
函数用于建立子路由,在下文建立子路由可以看到。使用前需要从
django.urls
中导入
re_path()
函数
路由规则
-
urlpatterns
中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
- 当浏览器访问请求的url不是以
/
结尾时,Django会自动给该请求加
/
结尾,并让浏览器重新访问。
设置为不主动加结尾处的
/方法:在
HelloWorld/settings.py文件中加入
APPEND_SLASH=False即可。配置文件中虽然没有这个参数, 但默认结果是
True;当配置完成后url请求后不加
/时是访问不到页面的。
- URLconf匹配的位置: URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串,会取网址之后
?
号之前的字符串来做正则匹配, 且匹配出来的所有东西都是字符串形式。
分发思路
把本该在项目目录下的
HelloWorld\\urls.py
中进行路由匹配的功能给分发到各个不同的App内,由其中的
urls.py
文件来进行路由匹配。在
HelloWorld\\urls.py
中建立分发指引路径
主路由和子路由
我们可以用将路由分为分为主路由和子路由
主路由由
HelleWorld\\setting.py
中的
ROOT_URLCONF
确定,默认为
HelloWorld\\urls.py
子路由是各App下的路由,需要手动创建,在此处匹配该App对应的各种功能。
在设置子路由时,可以在path使用name参数为其命名,这样就可以在views页面和html页面通过该名字反向获取URL使用路由
配置路由
建立子路由
在
MyApp
下新建
urls.py
,写入
from django.urls import pathfrom . import viewsurlpatterns = [path(\"\", views.hello),]
项目中存在多个App,且App内功能有重复命名时:
比较简单的做法是在每个App的
urls.py
中分别设置一个不同的
app_name
,如
# app1.urls.pyapp_name = \'app1\'#app2.urls.pyapp_name = \'app2\'即可在views和html中准确使用路由:reverse(\'app01:hello\')reverse(\'app02:hello\'){% url \'app02:hello\' %}
如果要实现代码的复用,或者了解app_name和namespace的区别可以参考https://www.jianshu.com/p/404500a0408a
建立视图
在
MyApp
下新建
view.py
,写入
from django.shortcuts import renderfrom django.template import loader,RequestContextfrom django.http import HttpResponse# Create your views here.def hello(request):return HttpResponse(\"Hello world ! \")