专栏首页Devops专栏Django 2.1.7 视图

Django 2.1.7 视图

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

参考文献

Django 2.1 官网文档

视图

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

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

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

# 查询某个服务器的详情信息 /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)

官网示例:

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

官网示例如下:

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配置,如下:

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文件,如下:

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,如下:

# 查询某个服务器下的所有中间件信息 /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 ,如下:

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文件如下:

# 查询某个中间件的详细信息 /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()方法即可,改为如下:

re_path('getMiddlewareinfoDetail/(\w+)/(\d+)/(\d+)',views.getMiddlewareinfoDetail,name='getMiddlewareinfoDetail'),

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

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

# 查询某个中间件的详细信息 /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()中的字典传递参数

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

直接上示例,如下:

    path('getMiddlewareinfoDetail/', views.getMiddlewareinfoDetail,
         {'server_name': '测试服务器', 'server_id': '1003', 'middleware_id': '1004'},
         name='getMiddlewareinfoDetail'),

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

浏览器测试如下:

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

前面使用re_path()匹配路径参数的时候,其实是按照()的顺序来设置参数的。 那么如果需要给匹配的参数进行命名,该怎么做呢? 这个可以使用正则匹配的(?P<参数名> 匹配规则) 来处理。

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

re_path('getMiddlewareinfoDetail/(?P<server_name>\w+)/(?P<server_id>\d+)/(?P<middleware_id>\d+)',
            views.getMiddlewareinfoDetail, name='getMiddlewareinfoDetail'),

使用浏览器测试如下:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 28. Vue 使用 vue-resource 发起post请求,增加列表数据

    定义数据列表为全局变量data_list,开发add_list视图函数设置增加data_list数据,开发get_list读取data_list数据。

    Devops海洋的渔夫
  • jquery 绑定事件 - submit() 用户递交表单

    这个submit()函数是在form表单点击submit按钮的时候默认可以触发的。 为什么需要触发这个submit()事件呢? 原因就是很多时候表单的提交并...

    Devops海洋的渔夫
  • 解决GitBook RangeError: Maximum call stack size exceeded

    在编写Gitbook的过程中,在启动gitbook serve预览的时候,发生了错误RangeError: Maximum call stack size ex...

    Devops海洋的渔夫
  • Python 之 Json序列化嵌套类方式

    Json在python中支持列表,字典(当然也支持int,string…..,不过说这个也没多大必要)

    砸漏
  • Python-matplotlib 学术柱状图绘制

    柱状图或条形图在学术论文中使用的频率还是很大的,图中需要以不同颜色对不同数据进行区分,但当涉及黑白打印时,色彩颜色的区别度较小,导致难以理解,因此需要绘制黑灰颜...

    气象学家
  • Django实战篇-论坛模板引擎

    小团子
  • python图片验证码识别最新模块muggle_ocr的示例代码

    黑科技?还是黑代码? 我感觉这个看在你用啥,对不对?反正我用来(* * * * ) 你懂得

    砸漏
  • Python Paramiko实现sftp文件上传下载以及远程执行命令

    Paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令、文件传输等功能。

    py3study
  • spark集群模式下textFile读取file本地文件报错解决

    如果在spark-shell中使用textFile(“file://path”)演示,在local模式下是没有问题的,因为毕竟就是在本机运行,读取本地的文件。但...

    十里桃花舞丶
  • 早鸟明天结束:《操作系统*硬实时*深度剖析》在线课程

    相信多数工程师们或多或少都对硬实时有一定的理解,但是仍然都其深入的实现机理不太了解。关于为什么有的操作系统可以做到硬实时,而有些却做不到,为什么可以做到或者为什...

    Linux阅码场

扫码关注云+社区

领取腾讯云代金券