上一篇中讲诉了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//', views.bio, name='bio'),
path('articles//', views.article, name='article-detail'),
path('articles///', views.section, name='article-section'),
path('weblog/', include('blog.urls')),
...
]
上面写url路径的时候是用path()方法,第一个参数route使用的是非正则表达式可以表示的普通路由路径。
注意:
- 要从URL捕获值,请使用尖括号。
- 捕获的值可以选择包括转换器类型。例如,用于
捕获整数参数。如果未包含转换器/
,则匹配除字符之外的任何字符串。 - 没有必要添加前导斜杠,因为每个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是默认的,那么路径自动匹配该函数的第二个形参,匹配格式:
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\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/
那么下面来改写一下这个示例,应用到代码中。
入口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///',views.getMiddlewareinfoDetail,name='getMiddlewareinfoDetail'),
]
为参数的字符串写法,但是不支持中文,涉及一个中文url编码的问题。
为参数的整数写法
写好了应用的转发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\w+)/(?P\d+)/(?P\d+)',
views.getMiddlewareinfoDetail, name='getMiddlewareinfoDetail'),
使用浏览器测试如下:
写到这里基本将GET请求的传参方式都说明了。