AI智能
改变未来

三、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()

可以接收四个参数,分别是两个必选参数:

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 ! \")
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 三、Django | 路由配置