zoukankan      html  css  js  c++  java
  • 路由配置系统(URLconf)

    URL配置(URLconf)就像Django所支撑网站的目录。

    它的本质是URL与要为该URL调用的视图函数之间的映射表。
    你就是以这种方式告诉Django,对于URL(1)调用代码(1), 对于URL(2)调用代码(2)

    urlpatterns = [
        url(正则表达式, views视图函数, 参数, 别名),
    ]

    参数说明:

    一个正则表达式字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数

    1. URLconf的正则字符串参数

    1.1 简单配置

    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),
    ]

    注意:

    • 一旦匹配成功则不再继续。若要从URL中捕获一个值,只需要在它周围放置一对圆括号。
    • 不需要添加一个前导的反斜杠,因为每个URL都有。例如,应该是【^articles】,而不是【^/articles】。
    • 每个正则表达式前面的“r”,是可选的,但是建议加上。

    一些请求的例子:

    /articles/2005/3/: 不需要匹配任何URL,因为列表中第三个模式要求月份应该是两个数字。
    /articles/2003/: 将匹配列表中第一个模式,不是第二个。因为模式按顺序匹配,第一个会首先测试是否匹配。
    /artic/2005/03/: 请求将匹配列表中的第三个模式。Django将调用函数views.month_archive(request, "2005", "03")

    1.2 有名分组

    上面的示例使用简单的,没有命名的正则表达式组(通过圆括号)来捕获URL中的值并以位置参数传递给视图。

    在更高级的用法中,可以使用命名的正则表达式组来捕获URL中的值并以关键字参数传递给视图。

    在Python正则表达式中,命名正则表达式组的做法是【(?P[name]pattern)】, 其中【name】是组的名称,【pattern】是要匹配的模式。

    下面是以上URL使用命名组的重写:

    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),
    ] 

    这个实现与前面的示例完全相同,只有一个细微的差别:

    捕获的值作为关键字参数而不是位置参数传递给视图函数,例如:

    /articles/2005/03: 请求将调用views.month_archive(request, year="2005", month="03")函数
    /articles/2003/03/03: 请求将调用函数views.article_detail(request, year="2003", month="03", day="03")

    在实际应用中,这意味着你的URLconf会更加明晰且不容易产生参数顺序问题的错误——你可以在你的视图函数定义中重新安排参数的顺序。

    当然,这些好处是以简洁为代价:有些开发人员认为命名组语法丑陋而繁琐。

    1.3 URLconf在查找什么

    URLconf在请求的URL上查找,将它当作一个普通的Python字符串,不包括GET和POST参数以及域名。

    例如:http://www.example.com/myapp/ 请求中,URLconf将查找【myapp/】。

     http://www.example.com/myapp/?page=3 请求中,URLconf仍将查找【myapp】。

    URLconf不检查请求的方法。换句话讲,所有的请求方法——同一个URL的【POST】、【GET】、【HEAD】等等——都将路由到相同的函数。

    1.4 捕获的参数永远是字符串

    每个捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。

    例如,下面这行URLconf中:

    ulr(r"^articles/(?P<year>[0-9]{4})/$", views.year_archive),

    views.year_archive()的year参数将是一个字符串

    1.5 指定视图参数的默认值

    有一个方便的小技巧是指定视图参数的默认值。

    下面是一个URLconf和视图的示例:

    from django.conf.urls import url
    form . import views
    urlpatterns = [
        url(r"^blog/$", views.page),
        url(r"^blog/page(?P<num>[0-9]+)/$", view.page),
    ]
    
    #view(in blog/views.py)
    def page(request, num="1"):
        ···
    

    在上面的例子中,两个URL模式指向同一个视图【views.page】——但是第一个模式不会从URL中捕获任何值。如果第一个模式匹配,【page()】函数将会使用【num】参数的默认值"1"。

    如果第二个模式匹配,【page()】将使用正则表达式捕获的【num】值。

    1.6 including中其他的URLconfs

    #At any point, your urlpatterns can “include” other URLconf modules. This
    #essentially “roots” a set of URLs below other ones.
    
    #For example, here’s an excerpt of the URLconf for the Django website itself.
    #It includes a number of other URLconfs:
    
    
    from django.conf.urls import include, url
    
    urlpatterns = [
       url(r'^admin/', admin.site.urls),
       url(r'^blog/', include('blog.urls')),
    ]

    2. 传递额外的选项给视图函数

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

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

    例如:

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
    ]

    在这个例子中,对于【/blog/2005/】请求,Django将调用view.year_archive(request, year="2005", foo="bar")。

    这个技术在Syndication框架中使用,来传递元数据和选项给视图。

    3. name参数

    urls如下:

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

    views如下:

    def index(req):
        if req.method=='POST':
            username=req.POST.get('username')
            password=req.POST.get('password')
            if username=='alex' and password=='123':
                return HttpResponse("登陆成功")
    
        return render(req,'index.html')

    html如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {#     <form action="/index/" method="post">#}
         <form action="{% url 'INDEX' %}" method="post">
             用户名:<input type="text" name="username">
             密码:<input type="password" name="password">
             <input type="submit" value="submit">
         </form>
    </body>
    </html>
    

     

     

     

  • 相关阅读:
    io学习
    asp.net文件上传进度条研究
    asp.net页面中的Console.WriteLine结果如何查看
    谨慎跟随初始目的不被关联问题带偏
    android 按钮特效 波纹 Android button effects ripple
    安卓工作室 日志设置
    安卓工作室 文件浏览器 android studio File browser
    一个新的Android Studio 2.3.3可以在稳定的频道中使用。A new Android Studio 2.3.3 is available in the stable channel.
    新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial
    码云,git使用 教程-便签
  • 原文地址:https://www.cnblogs.com/yang-wei/p/9979515.html
Copyright © 2011-2022 走看看