zoukankan      html  css  js  c++  java
  • 视图层:

    视图层:
    
    Django 有视图的观点来封装逻辑负责来处理用的请求和返回响应。
    
    找到需要的直到视图通过下面的信息:
    
    
    URL dispatcher  URL调度器
    
    一个干净,优雅的URL scheme是一个重要的细节在一个高质量的Web应用。
    
    Django 让你设计URLs,没有框架限制
    
    
    没有.php 或者.cgi 需要
    
    概述:
    
    设计URL 对于一个app,你创建一个Python 模块通俗的称为一个URlconf(URL 配置).
    
    这个模块是纯Python代码的,是一个简单的映射在URL 模式和Python函数之间
    
    这种映射可以是短的,或者按需的。 可以参考其他映射。
    
    因为它是纯Python代码,可以动态的重构
    
    
    
    Django 如何处理一个请求:
    
    当一个用户骑牛一个页面从Django-powered site,  这是系统遵循的算法来决定 哪段Python代码需要执行:
    
    1.Django 决定root URLconf 模块来使用,通常,这是ROOT_URLCONF setting
    
    但是如果进来的HttpRequest 请求有一个urlconf 属性,它的值会代替ROOT_URLCONF 设置
    
    2.Django 加载 Python 模块,寻找变量url欧式
    
    这是一个Python列表在  django.conf.urls.url() 
    
    3.Django 运行通过每个URL 模式,顺序的,在第一个匹配后就停止
    
    4. 一旦一个表达式匹配,Django 导入和调用给定的视图,是一个简单的函数(或者一个基于类的视图)
    
    视图通过以下参数
    
    1.一个HttpRequest实例
    
    2.如果匹配的正则表达式 返回 no named groups, 
    
    然后从正则表达式匹配的是作为位置参数:
    
    3.关键参数是由任何命名组通过正则表达式组成的,
    
    例子:
    
    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/([0-9]{4})/$', views.year_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
    ]
    
    注意:
    
    1.从URL 捕获一个值,只需在它周围放入一个圆括号
    
    2. 没有必要增加一个前导的斜杠,因为每个URL都有,例如  it’s ^articles, not ^/articles.
    
    3. 'r' 在每个正则表达式字符串前是可选的,但是是推荐的。
    
    它告诉Python 一个字符串是"raw"
    
    Example requests:
    
    1. 一个请求到/articles/2005/03/ 会匹配第3个条目在列表里。
    
    Django 会调用函数 views.month_archive(requests,'2005','03');
    
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    
    
    def month_archive(request, year,month):
         print '-----------------'
         print year
         print month
         print '-----------------'
         response = "zhaoyangjian TLCB You're looking at the second  results of question %s %s" %(year,month)
         return HttpResponse(response )
    	 
    http://192.168.137.3:9000/articles/2005/09/
    
    	
    zhaoyangjian TLCB You're looking at the second results of question 2005 09
    
    
    -----------------
    2005
    09
    -----------------
    [28/Jan/2018 12:03:05] "GET /articles/2005/09/ HTTP/1.1" 200 75
    
    2.
    /articles/2005/3/ 不会匹配任何URL 模式, 因为第3条在list需要2个数字对于月份
    
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    
    3.
    /articles/2003/ 会匹配第一个模式, 不是第2个,因为模式是按顺序测试的,第一个模式是第一个测试通过的。
    
    def special_case_2003(req):
        print '-------------------'
        print '-------------------'
        return HttpResponse('year')
    	
    
    	def special_case_2003(req):
        print '-------------------'
        print '-------------------'
        return HttpResponse('year')
    	
    	def year_archive(request, aaaa):
         print '-------------------------'
         print aaaa
         print '-------------------------'
         response = "You're looking at first  the results of question %s."
         return HttpResponse(response % aaaa)
    	 
    3./articles/2003/  会匹配 第一个模式,不是第2个,因为模式测试是按顺序的,
    
    第一个是第一个通过的测试。
    
    /articles/2003 不会匹配上面3个模式,因为每个模式需要URL 以斜杠结束
    
    4.
    /articles/2003/03/03/ would match the final pattern. Django would call the function views.article_detail(request, '2003', '03', '03').
    
    
    
    Named groups 命名分组
    
    上面的例子使用简单,非命名正则表达式分组(通过括号)来捕获URL的位置和传递它们作为额外的参数到一个视图。
    
    在更高级的用法里,它是可以使用命名正则表达式分组来捕获URL的位作为键值参数到一个视图
    
    
    在Python 正则表达式,命名正则表达式分组是(?P<name>pattern), name 是group的名字,模式是匹配的模式
    
    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
    ]
    
    这个与之前的例子完全相同, 有一个细微的区别:捕获的值是传递到视图函数作为键值相比作为位置参数:
    
    1.
    
    一个请求到  /articles/2005/03/ 会调用函数 views.month_archive(request, year='2005', month='03'), instead of views.month_archive(request, '2005', '03').
    
     url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', newview.month_archive),
     
     def month_archive(request, year,month):
         print '-----------------'
         print year
         print month
         print '-----------------'
         response = "zhaoyangjian TLCB You're looking at the second  results of question %s %s" %(year,month)
         return HttpResponse(response )
    	 
    	 
    http://192.168.137.3:9000/articles/2003/03/
    
    
    zhaoyangjian TLCB You're looking at the second results of question 2003 03
    
    2.
    A request to /articles/2003/03/03/ would call the function views.article_detail(request, year='2003', month='03', day='03').
    
    一个请求到/articles/2003/03/03/ 会调用函数 views.article_detail(request, year='2003', month='03', day='03').
    
    def article_detail(req,year,month,day):
        print year
        print month
        print day
        return HttpResponse(year+month+day)
    	
    	
    匹配和分组算法:
    
    这里的算法URLconf 解析如下,相当于命名粉盒和非命名分组
    
    1.如果有任何命名参数,它会使用那些,忽略未命名参数
    
    2.否则,它会传递所有非命名参数作为位置参数
    
    URLconf 搜索什么?
    
    URLconf 搜索请求的URL,作为一个Python字符串。这个不包括GET或者POST参数,或者域名
    
    For example, in a request to https://www.example.com/myapp/, the URLconf will look for myapp/.
    
    比如,在一个请求到  https://www.example.com/myapp/, URLconf 会查找myapp/
    
    In a request to https://www.example.com/myapp/?page=3, the URLconf will look for myapp/.
    
    在一个请求到  https://www.example.com/myapp/?page=3 URLconf 会查找myapp/
    
    URLconf 不看请求方法,换句话说,所有的请求方法  POST, GET, HEAD, etc
    会被路由到相同的函数对于相同的URL
    
    捕获的参数总是字符串
    
    每个捕获的参数是发送到视图作为一个Python字符串
    
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    
    year 参数传递到view.year,year_archive()是一个字符串的,
    
    不是整数,尽管通过[0-9]{4}  只是匹配整数的字符串
    
    
    指定视图参数的默认值:
    
    一个方便的技巧是为视图参数指定默认参数,有一个URLconf 和视图:
    
    url(r'^blog/$', newview.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', newview.page),
    
    
    def page(request,num="1"):
        print num
        return HttpResponse(num)
    
    	  url(r'^blog/$', views.page),
        url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
    	
    在上面的例子, URL 模式指向相同的视图--views.page
    
    但是第一个模式不捕获。
    
    如果第一个模式匹配,	page() 函数会使用它的默认参数对于num =1
    
    如果第2个模式匹配,page() 会使用捕获的值
    
    Performance 性能:
    
    每个正则表达式在一个urlpatterns是在第一次被编译,这使得系统非常快
    
    Including other URLconfs 包含其他URLconfs
    
    在任何时候,你的urlpatterns 可以包含其他URLconf模块,这个本质上'roots' 是在其他urls下的一组URLs
    
    
    例如,这里有一个 URLconf的引用对于Django website 本身,它包含了一些其他URLconfs的
    
    
    from django.conf.urls import include, url
    
    urlpatterns = [
        # ... snip ...
        url(r'^community/', include('django_website.aggregator.urls')),
        url(r'^contact/', include('django_website.contact.urls')),
        # ... snip ...
    ]
    
    
    注意,在这里例子中的正则表达式没有一个$(字符串尾部匹配字符) 但确实包含一个斜杠。
    
    当Django 遇到include()  (django.conf.urls.include()), 它砍下 URL匹配的部分
    
    url(r'^delEquipment/',include("news.urls")),
    
    
    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^(?P<year>[0-9]{4})/$', views.year_archive),
        url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
        url(r'^(?P<delip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/$', views.delEquipment),
        url(r'^date/$', views.my_view),
        url(r'^onearray/$', views.onearray),
        url(r'^displayonearray/$', views.displayonearray),
        url(r'^displayarrays/$', views.displayarrays),
        url(r'^arrays/$', views.arrays),
    
    ]
    
    
    Captured parameters 捕获参数:
    
    一个包含的URLconf 接收任何捕获的参数从父URLconfs,因此下面的例子是正确的:

  • 相关阅读:
    java 死锁
    阿里云 zookeeper
    spring 单元测试
    java hashmap分段锁实现
    java lambda 列表生成列表
    springAOP简介
    spring IOC小知识点
    spring中相互依赖的问题
    linux学习02-虚拟机安装CentOS之后联网
    linux学习01-虚拟机VirtualBox上安装centos7,小白第一步
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349282.html
Copyright © 2011-2022 走看看