zoukankan      html  css  js  c++  java
  • 运维开发笔记整理-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规则

  • 相关阅读:
    OK335xS-Android mkmmc-android-ubifs.sh hacking
    OK335xS-Android pack-ubi-256M.sh hacking
    OK335xS Ubuntu 12.04.1 版本 Android 开发环境搭建
    Qt Quick Hello World hacking
    Qt QML referenceexamples attached Demo hacking
    QT 5.4.1 for Android Ubuntu QtWebView Demo
    I.MX6 working note for high efficiency
    QT 5.4.1 for Android Windows环境搭建
    mkbootimg hacking
    Generate And Play A Tone In Android hacking
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10267949.html
Copyright © 2011-2022 走看看