前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python Django 编程 | 连载 02 - Django 路由

Python Django 编程 | 连载 02 - Django 路由

作者头像
RiemannHypothesis
发布2022-11-05 16:51:12
9480
发布2022-11-05 16:51:12
举报
文章被收录于专栏:ElixirElixir

一、Django 的路由

路由,既 URL 地址,每个 URL 都表示不同的页面,每个 URL 都会 views.py 中的一个视图函数。Django 项目根目录中的 urls.py 是根路由,可以集合所有应用的路由,每个应用下可以创建自己的 urls.py,这个 urls.py 是属于应用独有的路由

路由与视图函数绑定

使用 PyCharm 创建一个新的 Django 项目 django_urls_views,并创建 xray 应用,在 xray 应用下的 views.py 中创建一个视图函数 index(),该函数返回一个字符串。

代码语言:javascript
复制
from django.shortcuts import render, HttpResponse

# Create your views here.

def index(request):
    return HttpResponse("This is index of Xray")

接着在项目的根 URL 中配置路由,并与 xray 应用下的 index 视图函数绑定

代码语言:javascript
复制
from django.contrib import admin
# 导入 URL 模块
from django.urls import path
# 导入视图函数
from xray import views

# 项目 URL 列表,每个一个元素都表示一个 URL,每一个 URL 对应一个视图函数
urlpatterns = [
    path('admin/', admin.site.urls),
    path('xray/index/', views.index)
]
image.png
image.png

启动应用,在浏览器中访问地址 /xray/index/

image.png
image.png

页面显示的内容符合预期,但是当项目中的应用比较多的时候,这种直接在根 URL 中定义路由的方式是不推荐的,这样会使得根 URL 中定义的路由非常多,不好管理。

可以在每个应用中创建一个自己的 urls.py,在其中定义该应用包含的所有的路由,再在根路由中定义每一个应用的映射。

在 xray 应用文件夹下创建 urls.py,仿照根 urls.py 创建 index 函数的路由。

代码语言:javascript
复制
from django.urls import path
from xray import views


urlpatterns = [
    path('index/', views.index)
]

修改根路径下的 urls.py

代码语言:javascript
复制
from django.contrib import admin
from django.urls import path, include
# 导入 xray 应用下的 urls.py
from xray import urls as xray_urls


urlpatterns = [
    path('admin/', admin.site.urls),
    path('xray/', include(xray_urls))
]

启动应用,在浏览器中再次访问地址 /xray/index/

image.png
image.png

显示内容符合预期,说明修改成功,因此所有关于 xray 项目的路由都可以在该项目下的 urls.py 中定义。

二、Django 路由中的参数

在 URL 中可以通过在 ? 后面通过添加键值对 key=value 的方式来传递参数,当有多个键值对的时候使用 & 来连接,如 http://127.0.0.1:8000/xray/index?name=stark&address=newyork

也可以通过路径本身来传递参数,如 http://127.0.0.1:8000/xray/index/stark/

URL 中参数的类型可以是以下几种类型:

  • 字符串类型:匹配任何非空字符串,但不包括斜杠,在不指定类型的前提下,默认字符串类型 <str:name>
  • 整型:匹配 0 和正整数 <int:age>
  • slug:可以理解为注释、后缀或者负数等概念 <slug:day>
  • uuid:匹配一个 uuid 格式的对象 <uuid:uid>

在 Django 2.0 以前是使用正则表达式来匹配路径中参数的类型的,如

代码语言:javascript
复制
url(r'^add/(?P<name\w+>)/(?P<age>\d+)$')

其中 ^$ 表示匹配开始和结束,() 表示一个变量或字符,w+ 表示匹配 1 个或者多个包括下划线在内的任何字符,既 name 变量的取值可以是包括下划线在内的任何字符,d+ 表示匹配一个或者多个数字。

在 urls.py 中设置路由时,还支持给路由定义一个别名,这个别名在模板中做跳转或者其他视图函数中做重定向时可以用到。

代码语言:javascript
复制
path('/xray/index', views.index, name='xray_index')

URL 传递参数到后端的视图函数中有两种获取方式,如果是通过 ? 传递的参数,可以直接通过 request.GET.get(参数名) 的方式来获取。

如果是路径参数既通过 / 来分割的参数,可以直接将参数名放在视图函数的参数中,这样会把路径中具体的参数值保存到视图函数中的对应参数内。

代码语言:javascript
复制
def index(request, 参数1, 参数2):
    print(参数1, 参数2)

获取请求路径中 ? 后传递的参数

在 xray 应用的 views.py 文件中增加视图函数 tango

代码语言:javascript
复制
def tango(request):
    team = request.GET.get("team")
    print("请求中通过 `?` 传递的参数的值为: {}".format(team))
    return HttpResponse('This is Tango 5, Do you read?')

在 urls.py 中定义路由

代码语言:javascript
复制
# 其余代码不变

urlpatterns = [
    path('index/', views.index),
    path('tango', views.tango)
]

启动应用,在浏览器中输入 http://127.0.0.1:8000/xray/tango/?team=seal

image.png
image.png

页面成功获取到响应,控制也成功输出了请求路径中携带的参数

image.png
image.png

当传入多个参数时 ?team=seal&amp;location=Pakistan&amp;count=6,再通过上述的视图函数获取请求中的参数只能获取第一个

image.png
image.png

修改视图函数为如下形式:

代码语言:javascript
复制
def tango(request):
    request_param = request.GET
    print("保存多个请求参数的变量的数据类型是:{}".format(type(request_param)))
    print("请求中通过 `?` 传递的参数的值为: {}".format(request_param))
    return HttpResponse('This is Tango 5, Do you read?')

再次访问 ?team=seal&amp;location=Pakistan&amp;count=6

image.png
image.png
image.png
image.png

根据控制台的输出可以确定,多个参数会被保存成为一个查询字典,可以通过具体的 Key 来获取对应的 Value,接着就可以根据获取的参数进行各种逻辑处理了。

获取请求路径中的参数

在 xray 应用下的 views.py 中定义一个新的视图函数 yankee,在该视图函数中定义一个参数用来接收请求路径中传递过来的参数。

代码语言:javascript
复制
def yankee(request, location):
    print('路径参数中的 location 变量的值为:{}'.format(location))
    return HttpResponse('这是测试路径参数的页面')

在 urls.py 中增加 yankee 视图函数对应的路由,在路由中定义路径参数的变量名和变量值类型。

代码语言:javascript
复制
urlpatterns = [
    # 其余代码不变
    path('yankee/<str:location>/', views.yankee),
]

保存代码,浏览器访问 /xray/yankee/Pakistan/

image.png
image.png

控制台打印出路径中传递的参数 location 的值为 Pakistan

image.png
image.png

当路径中包含多个参数时,需要在视图函数中定义多个变量来接收请求路径中的参数,修改 yankee 视图函数

代码语言:javascript
复制
def yankee(request, location, num):
    print('路径参数中的 location 变量的值为:{}'.format(location))
    print('路径参数中的 num 变量的值为:{}'.format(num))
    return HttpResponse('这是测试路径参数的页面')

修改 urls.py 中的路由,该路由中定义了传递的多个参数的参数名和参数类型

代码语言:javascript
复制
urlpatterns = [
    # 其余代码不变
    path('yankee/<str:location>/<int:num>', views.yankee),
]

保存代码,浏览器访问 /xray/yankee/Pakistan/6/

image.png
image.png

控制台打印出路径参数中的 Pakistan 和 6

image.png
image.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Django 的路由
    • 路由与视图函数绑定
    • 二、Django 路由中的参数
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档