AqYoung

分享渗透知识与技巧

0%

Django之MTV框架模式(二)

View(视图层)

视图(View),即业务逻辑层。主要的职责是:存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。通俗来讲是用来接受Web请求,并做出响应。

urls

url()函数:可以接收四个参数,分别是两个必选参数regex、view 和两个可选参数kwargs、name:

regex:正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。

view:用于执行与正则表达式匹配的 URL 请求。

kwargs:视图使用的字典类型的参数。

name:用来反向获取 URL。

这里以一个简单的小例子:

# 创建一个新的app
python manage.py startapp view
# sttings.py注册
INSTALLED_APPS = [
    'view.apps.ViewConfig',
]
# urls.py导入
urlpatterns = [
url(r'^view/', include('view.urls')),
]
# 创建view/urls.py
urlpatterns = [
url(r'^index/', views.index)
]
# 测试
def index(request):
    return HttpResponse("view")


创建完成之后,测试一下。

路由器(regex)
按照列表的书写顺序进行匹配的
从上到下匹配,没有最优匹配的概念

例如:

urlpatterns = [
    url(r'^index', views.index),
    url(r'^indexs', views.indexs),
]

url1:http://127.0.0.1:8000/view/indexs/
url2:http://127.0.0.1:8000/view/index/

我访问上面两个url,返回的都是URL2的内容,

正确的应该以下面规则编写:

# 路由规则编写
我们通常直接指定以 ^ 开头
在结尾处直接添加反斜线
路由路径中的参数使用 () 进行获取
一个圆括号对应视图函数中的一个参数

路径参数

# 匹配一个数字参数
urlpatterns = [
    url(r'^index/(\d+)/', views.index),
]
# 用s_id来接收参数
def index(request,s_id):
    print(s_id)
    print(type(s_id))
    return HttpResponse("view")

1、位置参数

例如:

urlpatterns = [
    url(r'^index/(\d+)/(\d+)/(\d+)/', views.index),
]
# 按照书写顺序进行匹配
def index(request, yeas, moth, day):
    print(yeas, "-", moth, "-", day)
    return HttpResponse("Time:{yeas}-{moth}-{day}".format(yeas=yeas, moth=moth, day=day))

上面用三个参数(yeas, moth, day),来接收年月日

2、关键字参数

# 关键字参数写法
url(r'^index/(?P<yeas>\d+)/(?P<moth>\d+)/(?P<day>\d+)/', views.index, name='getdate'),
# 按照参数名称匹配,和顺序就无关了
def index(request, yeas, moth, day):
    return HttpResponse("Time:{yeas}-{moth}-{day}".format(yeas=yeas, moth=moth, day=day))

参数个数必须和视图函数中参数个数一致(除默认的request以外)

反向解析
根据根路由中注册的namespace和在子路由中注册name,这两个参数来动态获取我们的路径
在模板中使用  {% url 'namespace:name'  %}
如果带有位置参数  {% url 'namespace:name'  value1 value2 [valuen...] %}
如果带有关键字参数  {% url 'namespace:name' key1=value1 key2=value2 [keyn=valuen....] %}

后记:

最初的想法是做一个自己写的工具后台,所以Django的MTV就先学到这里,后续有需要的话,再去学习,查看文档或者google解决问题吧。


声明:

  • 笔者初衷用于分享与交流网络知识,若读者因此作出任何危害网络安全行为后果自负,与作者无关!