• 运维开发笔记整理-URL配置


                  运维开发笔记整理-URL配置

                                           作者:尹正杰 

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

    一.URL路由

       对于高质量的Web应用来说,使用简洁,优雅的URL的路由是一个非常值得重视的细节。Django让你随心所欲的设计你的URL,不受框架约束。

      为了给一个用用设计URL,你需要创建一个Python模块,通常称为URLconf(URL configuration)。这个模块是纯粹的Python代码,包含URL模式(简单的正则表达式)到Python函数(你的视图)的简单映射。

    二.Django如何处理一个请求

    1>.Django加载ROOT_URLCONF指定的模块,并寻找可用的urlpatterns,它是djngo.conf.urls.url()实力的一个Python列表;

    2>.Django依次匹配每个URL,在与请求的URL匹配的第一个url停下来;

    3>.一旦其中的一个正则表达式匹配上,Django将导入并调用给出的视图,它是一个简单的python函数(或者一个基于类的视图)。视图捕获如下参数:

      参数一:一个HttpRequest实例。

      参数二:如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。

      参数三:关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖。

    4>.如果没有匹配到正则表达式,或者如果过程这种抛出一个异常,django将调用一个适当的错误处理视图:handler404.handler500,handler403,handler400。

    三.URLconf

      URLconf是一个python模块,一个是URL模式(简单正则表达式)到python函数(视图)之间的映射。

     

    四.urlpatterns

      urlpatterns是一个url()实力类型的Python列表

      urlpatterns中的每个正则表达式在第一次访问它们时被编译

    五.url函数

    def url(regex, view, kwargs=None, name=None):
        if isinstance(view, (list, tuple)):
            # For include(...) processing.
            urlconf_module, app_name, namespace = view
            return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
        elif callable(view):
            return RegexURLPattern(regex, view, kwargs, name)
        else:
            raise TypeError('view must be a callable or a list/tuple in the case of include().')
    def url(regex, view, kwargs=None, name=None):

      regex:一个字符串(原始字符串)或简单的正则表达式。

      view:view参数是一个视图函数或as_view()的结果(基于类的视图)。

      kwargs:传递额外的参数给视图。

      name:url名称。

    六.include 示例

      案例一: 

    urlpatterns = [
        url( r'^$', RedirectView.as_view(url="/dashboard/")),
        url(r'^dashboard/', include("dashboard.urls")),
        url(r'^accounts/', include("accounts.urls")),
        url(r'^admin/', admin.site.urls),
    ]

      案例二:

    urlpatterns = [
        url(r"^user/", include([
        url(r'^list/$', view.userlist, name="user_list"),
        url(r'^info/$', view.userinfo, name="userer_inf),
        url(r'^modify/', include([
          url(r'status/$',view.modifystatus, name="user_modify_status"),
       ]))
      ]))
    ]

    七.位置参数 

       若要从URL中捕获一个值,只需要在它周围放置一对圆括号。

    项目根目录的url.py的配置

    from django.conf.urls import url,include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r"^dashboard/",include("dashboard.urls")),
    ]

    dashboard的APP中urls.py的配置

    #!/usr/bin/env python
    #_*_conding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    
    from django.conf.urls import url
    from . import  views
    
    urlpatterns = [
        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),
    ]

      dashboard的APP中views.py的配置

    #!/usr/bin/env python
    #_*_conding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    
    from django.http import HttpResponsedef year_archive(request,*args,**kwargs):
        print("位置参数:",args)
        print("关键字参数:",kwargs)
        return HttpResponse(args)
    
    
    def month_archive(request,*args,**kwargs):
        print("位置参数:", args)
        print("关键字参数:", kwargs)
        return HttpResponse(args)
    
    def article_detail(request,*args,**kwargs):
        print("位置参数:", args)
        print("关键字参数:", kwargs)
        return HttpResponse(args)

      webUI访问效果如下:

    八.关键字参数

     语法:

    (?p<name>pattern)

      name是传给视图参数的名字。

      pattern是一个正则表达式,也是关键字参数的值。案例代码如下,我们将上面的位置参数的代码不要做修改,只需要改动dashboard的配置:

    #!/usr/bin/env python
    #_*_conding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    
    from django.conf.urls import url
    from . import  views
    
    urlpatterns = [
        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),
    ]

      访问webUI在后端可以看到传递的具体参数,如下图所示:

      

    九.额外参数

      URLconfs具有一个钩子,让你传递一个python字典作为额外的参数传递给视图函数。

      django.conf.urls.url()函数可以接受一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

    #!/usr/bin/env python
    #_*_conding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    
    from django.conf.urls import url
    from . import  views
    
    urlpatterns = [
        url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'Name': '尹正杰'}),
    ]

      上面的代码是dashboard的APP中的urls.py配置,下面的代码是dashboard的APP中的views.py的配置:

    #!/usr/bin/env python
    #_*_conding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    
    from django.http import HttpResponsedef year_archive(request,*args,**kwargs):
        print("位置参数:",args)
        print("关键字参数:",kwargs)
        return HttpResponse(args)

      访问webUI效果如下:

    十.URL反向解析

       django给每个URL取了一个名字,存储每个URL和name的映射关系。

      根据Django视图的标识和将要传递给他的参数的值,获取与之关联的URL。这种方式叫做反向解析URL,反响URL匹配,反响URL查询或者简单的URL反查。

    #!/usr/bin/env python
    #_*_conding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    
    from django.conf.urls import url
    from . import  views
    
    urlpatterns = [
        url(r"^$",views.index),
        url(r"^login/",views.user_login),
        url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    ]

      上面代码是dashboard的APP中的urls.py文件,下面的代码是bashboard的APP中的views.py,具体内容如下:

    #!/usr/bin/env python
    #_*_conding:utf-8_*_
    #@author :yinzhengjie
    #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
    
    from django.http import HttpResponseRedirectfrom django.core.urlresolvers import reverse
    def year_archive(request,*args,**kwargs):
        print("===",args)
        print(kwargs)
        print('news-year-archive')
        year = 2006
        print(args)
        return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

      如果你使用django的模板代码的话,需要进行如下调用:

    <a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a>

     

       想要了解Django2.0以上版本的url编写规则吗?详情请参考我之前的笔记:《玩转Django2.0》读书笔记-编写URL规则

  • 相关阅读:
    关于链表的一个小程序
    位操作
    结构和其他数据形式
    存储类、链接、内存管理
    文件输入/输出
    为什么返回IEnumerbale而不是List
    EncType
    script标签不能闭合
    jqueryUI AutoCompelete
    ChangeType
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10267949.html
Copyright © 2020-2023  润新知