我们可以直接在 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
时,自动生成了一系列文件
之后我们需要在 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)
include()
函数include()
函数用于建立子路由,在下文建立子路由可以看到。使用前需要从 django.urls
中导入
re_path()
函数urlpatterns
中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。/
结尾时,Django会自动给该请求加 /
结尾,并让浏览器重新访问。设置为不主动加结尾处的
/
方法:在HelloWorld/settings.py
文件中加入APPEND_SLASH=False
即可。配置文件中虽然没有这个参数, 但默认结果是True
;当配置完成后url请求后不加/
时是访问不到页面的。
?
号之前的字符串来做正则匹配, 且匹配出来的所有东西都是字符串形式。把本该在项目目录下的 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 path
from . import views
urlpatterns = [
path("", views.hello),
]
项目中存在多个App,且App内功能有重复命名时:
比较简单的做法是在每个App的 urls.py
中分别设置一个不同的 app_name
,如
# app1.urls.py
app_name = 'app1'
#app2.urls.py
app_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 render
from django.template import loader,RequestContext
from django.http import HttpResponse
# Create your views here.
def hello(request):
return HttpResponse("Hello world ! ")