前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django 2.1.7 视图

Django 2.1.7 视图

作者头像
Devops海洋的渔夫
发布2019-06-11 16:23:42
7180
发布2019-06-11 16:23:42
举报
文章被收录于专栏:Devops专栏Devops专栏

上一篇中讲诉了Django关于模型的设计以及数据操作,本篇章就来继续讲解关于模板的内容。

参考文献

Django 2.1 官网文档

视图

现在让我们向 assetinfo/views.py 里添加更多视图。那么增加什么类型的视图呢?根据之前篇章创建的服务器-中间件信息表,那么可以根据视图查询数据,然后返回到页面之中。

那么先来定义一下下面做哪些查询视图页面:

  • 查询某个服务器的详情信息 /getServerinfoDetail?server_id=
  • 查询某个服务器下的所有中间件信息 /getServerAllMiddlewareinfo?serverId=
  • 查询某个中间件的详细信息 /getMiddlewareinfoDetail?MiddlewareId=

在 assetinfo/views.py 定义视图如下:

代码语言:javascript
复制
# 查询某个服务器的详情信息 /getServerinfoDetail?server_id=
def getServerinfoDetail(request, server_id):
    return HttpResponse("getServerinfoDetail, Server's ID is %s." % server_id)

# 查询某个服务器下的所有中间件信息 /getServerAllMiddlewareinfo?serverId=
def getServerAllMiddlewareinfo(request, server_id):
    response = "getServerAllMiddlewareinfo, Server's ID is %s."
    return HttpResponse(response % server_id)

# 查询某个中间件的详细信息 /getMiddlewareinfoDetail?MiddlewareId=
def getMiddlewareinfoDetail(request, middleware_id):
    return HttpResponse("getMiddlewareinfoDetail, MiddlewareId is %s." % middleware_id)

那么写好了视图之后,下一步就是编写配置url的访问路径,以及参数的获取了。

认识 path() 和 re_path()

path()

官方参考文档

path(route, view, kwargs=None, name=None)

官网示例:

代码语言:javascript
复制
from django.urls import include, path

urlpatterns = [
    path('index/', views.index, name='main-view'),
    path('bio/<username>/', views.bio, name='bio'),
    path('articles/<slug:title>/', views.article, name='article-detail'),
    path('articles/<slug:title>/<int:section>/', views.section, name='article-section'),
    path('weblog/', include('blog.urls')),
    ...
]

上面写url路径的时候是用path()方法,第一个参数route使用的是非正则表达式可以表示的普通路由路径。

注意:

  • 要从URL捕获值,请使用尖括号。
  • 捕获的值可以选择包括转换器类型。例如,用于 <int:name>捕获整数参数。如果未包含转换器/,则匹配除字符之外的任何字符串。
  • 没有必要添加前导斜杠,因为每个URL都有。例如,它articles不是/articles

默认情况下,以下路径转换器可用:

  • str- 匹配除路径分隔符之外的任何非空字符串'/'。如果转换器未包含在表达式中,则这是默认值。
  • int - 匹配零或任何正整数。返回一个int
  • slug - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如, building-your-1st-django-site
  • uuid - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。
  • path- 匹配任何非空字符串,包括路径分隔符 '/'。这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str

比如要匹配一个视图中的函数路由,该函数有两个形参:

def peopleList(request,book_id)

第一个request是默认的,那么路径自动匹配该函数的第二个形参,匹配格式:<int:book_id>,并返回一个正整数或零值。

re_path()

官网参考文档

re_path(route, view, kwargs=None, name=None)

导入re_path方法,命令如下:

from django.urls import re_path

官网示例如下:

代码语言:javascript
复制
from django.urls import include, re_path

urlpatterns = [
    re_path(r'^index/$', views.index, name='index'),
    re_path(r'^bio/(?P<username>\w+)/$', views.bio, name='bio'),
    re_path(r'^weblog/', include('blog.urls')),
    ...
]

总结上述的两个方式都是Django 2.x 的新方法,path() 不能用正则的方式编写,re_path() 则可以使用正则匹配。

配置新视图的url

https://blog.csdn.net/cf313995/article/details/83105037

配置url有两种方式,一种是GET请求中?的传参方式,另一种是路径参数的传递方式。

配置以?的传参方式

采用path()即可实现,首先看看原来的入口urls配置,如下:

代码语言:javascript
复制
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('assetinfo/', include('assetinfo.urls')), # 导入assetinfo应用的urls.py
    path('admin/', admin.site.urls),
]

可以看到跟上面使用path()方法的配置不需要修改,下面来看看应用里面的urls该怎么写。

打开assetinfo/urls.py文件,如下:

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

from . import views

urlpatterns = [
    # ex: /assetinfo/
    path('', views.index, name='index'),
    # ex: /assetinfo/getServerAllMiddlewareinfo?serverName=测试服务器&middlewareinfoName=redis
    path('getServerAllMiddlewareinfo',views.getServerAllMiddlewareinfo,name='getServerAllMiddlewareinfo'),
]

为了更加直观演示,我其实在视图参数设置接收两个GET请求的参数,下面继续看看我改了一下的视图文件assetinfo/views.py,如下:

代码语言:javascript
复制
# 查询某个服务器下的所有中间件信息 /getServerAllMiddlewareinfo?serverName=测试服务器&middlewareinfoName=redis
def getServerAllMiddlewareinfo(request):
    # 直接从GET请求中获取参数。
    server_name = request.GET.get('serverName', '')
    middlewareinfo_name = request.GET.get('middlewareinfoName', '')
    response = "getServerAllMiddlewareinfo, Server name is %s and  Middlewareinfo Name is %s."
    return HttpResponse(response % (server_name,middlewareinfo_name))

在浏览器测试访问如下:

可以看到两个参数都可以接收到了。

下面再来看看通过url路径来传递参数的方法。

配置以路径的传参方式

参数不再以?形式进行拼接,而是以路径/a/a的形式进行传递。

示例写法:

path('articles/<slug:title>/<int:section>/', views.section, name='article-section'),

那么下面来改写一下这个示例,应用到代码中。

入口urls.py不需要修改,只需要修改一下应用的urls.py文件。

打开assetinfo/urls.py ,如下:

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

from . import views

urlpatterns = [
    # ex: /assetinfo/
    path('', views.index, name='index'),
    # ex: /assetinfo/getServerAllMiddlewareinfo?serverName=测试服务器&middlewareinfoName=redis
    path('getServerAllMiddlewareinfo',views.getServerAllMiddlewareinfo,name='getServerAllMiddlewareinfo'),
    # ex: /assetinfo/getMiddlewareinfoDetail/server_name/server_id/middleware_id
    path('getMiddlewareinfoDetail/<slug:server_name>/<int:server_id>/<int:middleware_id>',views.getMiddlewareinfoDetail,name='getMiddlewareinfoDetail'),
]

<slug:server_name> 为参数的字符串写法,但是不支持中文,涉及一个中文url编码的问题。

<int:server_id> 为参数的整数写法

写好了应用的转发urls之后,下面来开始写视图。

打开assetinfo/views.py文件如下:

代码语言:javascript
复制
# 查询某个中间件的详细信息 /getMiddlewareinfoDetail/server_id/middleware_id
def getMiddlewareinfoDetail(request, server_name, server_id, middleware_id):
    return HttpResponse("getMiddlewareinfoDetail, ServerName is %s , ServerId is %s , MiddlewareId is %s." % (server_name,server_id,middleware_id))

浏览器测试访问如下:

可以看到三个参数都接收并返回浏览器了,下面来看看输入中文的字符串,如下:

如果要解决这个中文字符串的路径传参的问题,那么就可以使用re_path()的正则匹配来解决。

或者直接改用上面使用?的传参方式即可。

配置re_path正则匹配路径方式,解决中文字符串路径传参问题

入口urls.py文件不需要修改,直接在应用的urls.py文件修改即可。

直接替换原先的path()方法即可,改为如下:

代码语言:javascript
复制
re_path('getMiddlewareinfoDetail/(\w+)/(\d+)/(\d+)',views.getMiddlewareinfoDetail,name='getMiddlewareinfoDetail'),

使用\w匹配中文字符是没问题的。

再来查看一下assetinfo/views.py的代码,如下:

代码语言:javascript
复制
# 查询某个中间件的详细信息 /getMiddlewareinfoDetail/server_id/middleware_id
def getMiddlewareinfoDetail(request, server_name="default", server_id=0, middleware_id=2):
    return HttpResponse("getMiddlewareinfoDetail, ServerName is %s , ServerId is %s , MiddlewareId is %s." % (
    server_name, server_id, middleware_id))

给每个参数写上默认值,避免参数缺失报错。

现在来浏览器测试一下,如下:

可以正常使用中文了。

使用path()中的字典传递参数

当服务器有些隐藏的参数需要带上,又不想每次请求都添加参数请求,那么可以使用字典的参数传递。

直接上示例,如下:

代码语言:javascript
复制
    path('getMiddlewareinfoDetail/', views.getMiddlewareinfoDetail,
         {'server_name': '测试服务器', 'server_id': '1003', 'middleware_id': '1004'},
         name='getMiddlewareinfoDetail'),

视图代码需要写上对应的形参,如下:

浏览器测试如下:

re_path() 正则匹配执行参数名

前面使用re_path()匹配路径参数的时候,其实是按照()的顺序来设置参数的。

那么如果需要给匹配的参数进行命名,该怎么做呢?

这个可以使用正则匹配的(?P<参数名> 匹配规则) 来处理。

打开assetinfo/urls.py直接上代码,如下:

代码语言:javascript
复制
re_path('getMiddlewareinfoDetail/(?P<server_name>\w+)/(?P<server_id>\d+)/(?P<middleware_id>\d+)',
            views.getMiddlewareinfoDetail, name='getMiddlewareinfoDetail'),

使用浏览器测试如下:

写到这里基本将GET请求的传参方式都说明了。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考文献
  • 视图
  • 认识 path() 和 re_path()
    • path()
    • re_path()
    • 配置新视图的url
    • 配置以?的传参方式
    • 配置以路径的传参方式
    • 配置re_path正则匹配路径方式,解决中文字符串路径传参问题
    • 使用path()中的字典传递参数
    • re_path() 正则匹配执行参数名
    相关产品与服务
    消息队列 TDMQ
    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档