三、Django | 路由配置

创建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() 可以接收四个参数,分别是两个必选参数:routeview 和两个可选参数:kwargsname

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 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 ! ")

你可能感兴趣的:(Django,django,python)